设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1876|回复: 3
打印 上一主题 下一主题

[推荐问答] 关于dispose

[复制链接]

Lv1.梦旅人

梦石
0
星屑
65
在线时间
84 小时
注册时间
2008-3-31
帖子
88
跳转到指定楼层
1
发表于 2013-8-26 21:21:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 490832999 于 2013-8-26 23:21 编辑

事件:
   新建一个事件
   加入脚本如下:
   @s = Sprite.new
   @s.bitmap = Bitmap.new(1,1)
   显示选项[是][否]
      [是]
         文章:你选择了是
      [否]
         文章:你选择了否
   结束选项
   @s.bitmap.dispose
   @s.dispose

操作:
   开始游戏,访问事件,保存游戏
   出错(提示:no marshal_dump is defined for class Sprite)

问题:
   如果在@s.dispose之后再加上@s=nil,则不会出错,这是为什么呢?
   1.为什么@s.dispose之后,@s!=nil?
   2.为什么保存的时候,会与这个@s有关系?

评分

参与人数 1星屑 +100 收起 理由
Luciffer + 100 分类

查看全部评分

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4504
在线时间
5228 小时
注册时间
2009-4-29
帖子
14318

贵宾

来自 2楼
发表于 2013-8-26 21:54:14 | 只看该作者
本帖最后由 protosssonny 于 2013-8-26 21:59 编辑

我遇到很多次这样的问题了,个人理解就是因为Sprite不能写入存档,就是这么简单。
如果深度分析的话,让我们来看看事件的【脚本】命令的写法:
(先@Index干扰很大)
  1.   #--------------------------------------------------------------------------
  2.   # ● 脚本
  3.   #--------------------------------------------------------------------------
  4.   def command_355
  5.     script = @list[@index].parameters[0] + "\n"
  6.     loop do
  7.       if @list[@index+1].code == 655        # 下一个事件指令在脚本2行以上的情况下
  8.         script += @list[@index+1].parameters[0] + "\n"
  9.       else
  10.         break
  11.       end
  12.       @index += 1
  13.     end
  14.     eval(script)
  15.     return true
  16.   end
复制代码
那么显然@s是属于class Game_Interpreter的实例变量。
然后我们查找Game_Interpreter.new,发现Game_Troop、Game_Map、Game_CommonEvent、Game_Event四个类都生成了实例Game_Interpreter

且Game_Troop和Game_Map是要被写入存档的。

即写入存档的$game_troop和$game_map包含的实例Game_Troop和Game_Map,它们又包含了实例Game_Interpreter,@s是属于class Game_Interpreter的实例变量且为Sprite实例,Sprite不能存档,于是报错。

点评

sprite这种都是即用即加载,用完之后就dispose掉的,所以不需要载入存档。当然也许有储存sprite的其他方法,只是我才疏学浅不知道罢了↓  发表于 2013-8-26 22:23
原来还有这种梗,受教了。话说有没有什么办法能在Marshal.dump的时候自动调用sprite的方法?储存sprite实际上储存一些实例变量就行了  发表于 2013-8-26 22:19
在铅笔君面前献丑了,铅笔君才是大触手,我一直很佩服铅笔君。↓  发表于 2013-8-26 22:11
精品文章。。这么有营养的东西很久没看到了。。而且每天的分也花不掉。。就给p叔了。。  发表于 2013-8-26 22:01

评分

参与人数 2星屑 +240 收起 理由
Password + 180 精品文章精品文章精品文章精品文章.
铅笔描绘的思念 + 60 精品文章。。这么有营养的东西很久没看到了.

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
84 小时
注册时间
2008-3-31
帖子
88
3
 楼主| 发表于 2013-8-26 22:00:43 | 只看该作者
protosssonny 发表于 2013-8-26 21:54
我遇到很多次这样的问题了,个人理解就是因为Sprite不能写入存档,就是这么简单。
如果深度分析的话,让我 ...

谢谢P叔,明白了为什么存档会出错了.

还有那个,dispose,释放的作用.

为什么@s.dispose之后 @s还是一个class Sprite 而不是nil
究竟是释放了什么东西?

点评

是置顶,不是编辑成已经解决。擅自编辑标签是违反版规的。  发表于 2013-8-26 23:29
请问是否已经解决,如果解决了请将认可的楼层【置顶】,谢谢。  发表于 2013-8-26 22:47
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4504
在线时间
5228 小时
注册时间
2009-4-29
帖子
14318

贵宾

4
发表于 2013-8-26 22:08:13 | 只看该作者
490832999 发表于 2013-8-26 22:00
谢谢P叔,明白了为什么存档会出错了.

还有那个,dispose,释放的作用.

释放之后不不为nil
你可以
  1. @s = Sprite.new
  2. @s.dispose
  3. p @s.class # => Sprite
  4. p @s.disposed? # => true
复制代码
@s.class依旧会显示是Sprite,而不是nil,至于dispose之后为什么是Sprite而不是nil,是由方法def dispose决定的,不然就不会有disposed?这方法。要想存档,必须使这个变量@s不为Sprite即@s = nil当然也可以是@s = 100或者@s = []等等……

点评

额,原来不能编辑标签的啊.. 原谅我的无知吧.. 原来置顶是在贴的右下角管理..  发表于 2013-8-27 00:42
好了,明白了.  发表于 2013-8-26 23:21

评分

参与人数 1梦石 +1 收起 理由
Luciffer + 1 认可答案

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 05:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表