Project1

标题: 关于dispose [打印本页]

作者: 490832999    时间: 2013-8-26 21:21
标题: 关于dispose
本帖最后由 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有关系?
作者: 怪蜀黍    时间: 2013-8-26 21:54
本帖最后由 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不能存档,于是报错。
作者: 490832999    时间: 2013-8-26 22:00
protosssonny 发表于 2013-8-26 21:54
我遇到很多次这样的问题了,个人理解就是因为Sprite不能写入存档,就是这么简单。
如果深度分析的话,让我 ...

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

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

为什么@s.dispose之后 @s还是一个class Sprite 而不是nil
究竟是释放了什么东西?
作者: 怪蜀黍    时间: 2013-8-26 22:08
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 = []等等……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1