Project1

标题: [怨念的产物]即时存档 v1.4 更新 [打印本页]

作者: 灼眼的夏娜    时间: 2009-2-15 20:01
标题: [怨念的产物]即时存档 v1.4 更新
今天没事整理RM工程的时候发现以前留下的一个坑 于是填补之~~~ XD  = =

即时存档 v1.0
(所谓即时存档也就是每帧都可以存档- -废话><)

F5  # 存档
F6  # 读档
F7  # 增加存档编号
F8  # 减少存档编号

支持9个存档


by 灼眼的夏娜

点击下载范例v1.4

大部分更新了模块变量(所谓模块变量实际包括模块或类的实例变量和类变量)和全局变量部分代码。具体如下:
  #--------------------------------------------------------------------------
  # ● 循环遍历模块自身内部的所有类和模块(以下这种情况的 @dmy 不会被保存)
  #--------------------------------------------------------------------------
  # ! class A
  #     class B
  #       @dmy = 54
  #     end
  #   end
  def each_module_variables(ref_hash, mod)
    mod.constants.each do |const|
      klassname = format("%s::%s", mod.name, const)
      if (klass = eval(klassname)).is_a?(Module)
        if klass.respond_to? :marshal_dump
          ref_hash[klassname] = [klass.marshal_dump]
        else
          if not (varnames = klass.class_variables + klass.instance_variables).empty?
            hash = {}
            varnames.each{|var| hash[var] = klass.module_eval(var)}
            ref_hash[klassname] = hash
          end
        end
        each_module_variables(ref_hash, klass) if klass.instance_of?(Module)
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● marshal_dump模块变量(所谓模块变量实际包括模块或类的实例变量和类变量)
  #
  #   如果模块或类中定义了 self.marshal_dump 方法则调用改方法进行marshal_dump
  #   于此同时模块或类中必须定义一个 self.marshal_load(obj) 方法负责数据的还原
  #
  #   其他情况则默认方法进行存取
  #--------------------------------------------------------------------------
  def marshal_dump_module_variables(mod = Object)
    hash = {}
    each_module_variables(hash, mod)
    return hash
  end
  
  #--------------------------------------------------------------------------
  # ● marshal_load模块变量
  #--------------------------------------------------------------------------
  def marshal_load_module_variables(ref_hash)
    ref_hash.each do |klassname, var_hash|
      klass = eval(klassname)
      if var_hash.is_a?(Array)
        if klass.respond_to? :marshal_load
          klass.marshal_load(var_hash[0])
        else
          raise TypeError.new(format("%s needs to have method `marshal_load'", klass.name))
        end
      else
        var_hash.each{|key, value| klass.module_eval("#{key} = value")}
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● marshal_dump必要的全局变量(可以在这里添加)
  #--------------------------------------------------------------------------
  def marshal_dump_global_variables
    # global_variables  # 参考使用- -b
  end
  
  #--------------------------------------------------------------------------
  # ● marshal_load全局变量
  #--------------------------------------------------------------------------
  def marshal_load_global_variables(ref_hash)
   
  end
这两组函数都被设计成可返回任意类型对象,同Marshal模块中的 marshal_dump和marshal_load。对于模块变量的保存,如果相应类和模块中存在self.marshal_dump和self.marshal_load则会调用该组函数进行存储和读取。

点击下载范例v1.3
更新了位图存储方式,把原来的数据存储更改为存储操作步骤。现在速度快、存储文件小、当然出现bug的几率也更大- -b

点击下载范例v1.2
      # 这里注释掉了 重新设置地图事件会造成$game_map中characters同Sprite_Character
      # 中的@character不一致
      
#     # 魔法编号与保存时有差异的情况下
#     if $game_system.magic_number != $data_system.magic_number
#       # 重新装载地图
#       $game_map.setup($game_map.map_id)
#       $game_player.center($game_player.x, $game_player.y)
#     end
#     # 刷新同伴成员
#     $game_party.refresh
#     # 刷新地图 (执行并行事件)
#     $game_map.update
没更新什么代码 只是注释掉了这段可能引起对象引用不一致的代码 以前考虑多了= =ORZ

点击下载范例v1.1

修正了1.0中未保存位图字体对象的问题。


点击下载范例工程

范例工程附带存档一个,在标题画面按F6读档,可以到战斗画面。= =
[LINE]1,#dddddd[/LINE]

此脚本难度应该还是比较大的,不过有一定脚本基础熟悉Ruby对象的人应该都能够看明白。
脚本使用也相对复杂,对于完全没有经验的人建议直接以上面提供的范例工程进行游戏制作。

对于想学习脚本的人请继续往下看:

工程中添加了[修改]字样的都是经过修改过的地方,在脚本页中搜索[修改]就能找到。
添加了[添加]的就是新建的脚本页。

最后需要注意的地方:
所谓存档当然就是把游戏中的数据写入文件,熟悉Ruby的都知道默认最好采用Marshal模板。该脚本也一样。

1、这里请采用marshal_dump和marshal_load,不要采用采用Object#_dump和Class#_load存储RGSS的内部类。
2、marshal_load地方注意
self.send :initialize, *args

发送一个initialize消息给对象,并传递args参数。
3、Object类中添加args变量保存参数,并重定义Class#new方法。
4、marshal_dump的时候
get_ins_vars_key_value_hash

的调用
marshal_load的时候
set_ins_vars_key_value

的调用
5、最后dump数据的时候请采用
    mgd = MarshalGameData.new
    mgd.game_temp = $game_temp
    mgd.game_system = $game_system   
    # dump
    Marshal.dump(mgd, file)

的形式,不要采用
Marshal.dump($game_temp, file)
Marshal.dump($game_system, file)

的形式

6、其他ms没什么需要特别注意的地方了 都很简单 - -bb

这几个问题感兴趣的可以考虑下为什么,如果不可以会有啥问题。最后不明白的可以问偶= =

遁·
作者: 霜冻之狼    时间: 2009-2-15 20:04
每帧都可以存档....这样不卡吗...
作者: 灼眼的夏娜    时间: 2009-2-15 20:06
以下引用霜冻之狼于2009-2-15 12:04:48的发言:

每帧都可以存档....这样不卡吗...

- -每帧都可以存档 不是每帧都存档- - 热键存档- -><
作者: 凌辰    时间: 2009-2-15 20:07
如果是非正常退出也能存下来?
那就太好了……
作者: 霜冻之狼    时间: 2009-2-15 20:09
........这样不太好吧
比如刚好播放动画或者改变画面色调的时候,玩家就存档...
然后再读档玩,会发现这两个命令失效了...

不如改成出错时存档.....
作者: 灼眼的夏娜    时间: 2009-2-15 20:11
以下引用凌辰于2009-2-15 12:07:01的发言:

如果是非正常退出也能存下来?
那就太好了……

这个和是否正常退出没关系- - 热键存档= =
不管是战斗 事件运行中 菜单中= =

以下引用霜冻之狼于2009-2-15 12:09:15的发言:

........这样不太好吧
比如刚好播放动画或者改变画面色调的时候,玩家就存档...
然后再读档玩,会发现这两个命令失效了...

不如改成出错时存档.....


[本贴由作者于 2009-2-15 12:09:38 最后编辑]

读档依然是刚播放动画 刚改变色调的时候的。。。= =
作者: 凌辰    时间: 2009-2-15 20:14
这样的话,就可以做到剧情进行时存档?
像AVG那样么……也好。
当年玩黑剑时剧情到一半我妈叫吃饭,等剧情完等很久- -
作者: 御风天之痕    时间: 2009-2-15 20:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 霜冻之狼    时间: 2009-2-15 20:20
以下引用灼眼的夏娜于2009-2-15 12:11:38的发言:
读档依然是刚播放动画 刚改变色调的时候的。。。= =

夏娜可以试下动画播放到一半的时候存档,
读档后你会发现动画没有继续播放...
作者: 灼眼的夏娜    时间: 2009-2-15 20:21
以下引用霜冻之狼于2009-2-15 12:20:45的发言:


以下引用灼眼的夏娜于2009-2-15 12:11:38的发言:
读档依然是刚播放动画 刚改变色调的时候的。。。= =

夏娜可以试下动画播放到一半的时候存档,
读档后你会发现动画没有继续播放...

- -测试过了。。。 可以的啊- -

作者: 雷欧纳德    时间: 2009-2-15 21:55
就是类似gba模拟器的即时存档功能,我常用这功能刷属性点
作者: redant    时间: 2009-2-15 23:04
夏娜大大的东西 先下下来 {/wx}
作者: 小柯    时间: 2009-2-15 23:26
因为我做的一个游戏有这个需要,
所以用某个其他的脚本凑了一个……
就是柳柳写的可以通过事件脚本来存档的脚步,
运用那个,并行一个事件就好了……好在就是就算每帧都存也不会卡。
[LINE]1,#dddddd[/LINE]
那么按键自存的话大概就是并行的时候价格按键判断吧。
似乎不管什么时候并行事件都在运行……
作者: 灼眼的夏娜    时间: 2009-2-15 23:30
以下引用小柯于2009-2-15 15:26:44的发言:

因为我做的一个游戏有这个需要,
所以用某个其他的脚本凑了一个……
就是柳柳写的可以通过事件脚本来存档的脚步,
运用那个,并行一个事件就好了……好在就是就算每帧都存也不会卡。



那么按键自存的话大概就是并行的时候价格按键判断吧。
似乎不管什么时候并行事件都在运行……


[本贴由作者于 2009-2-15 15:27:50 最后编辑]


默认的存档事件运行中无法存档的。。。 该存档保证在任何情况下 包括对话文字刚显示一个字 动画刚播放一半等情况都可以存档= =

作者: 霜冻之狼    时间: 2009-2-15 23:50
哇...好无敌....
夏娜果然是高人...
作者: 小柯    时间: 2009-2-16 00:05
以下引用灼眼的夏娜于2009-2-15 15:30:12的发言:


以下引用小柯于2009-2-15 15:26:44的发言:

因为我做的一个游戏有这个需要,
所以用某个其他的脚本凑了一个……
就是柳柳写的可以通过事件脚本来存档的脚步,
运用那个,并行一个事件就好了……好在就是就算每帧都存也不会卡。



那么按键自存的话大概就是并行的时候价格按键判断吧。
似乎不管什么时候并行事件都在运行……


[本贴由作者于 2009-2-15 15:27:50 最后编辑]



默认的存档事件运行中无法存档的。。。 该存档保证在任何情况下 包括对话文字刚显示一个字 动画刚播放一半等情况都可以存档= =

那我可以把那个东西替换掉了…… = =
因为我那个方法,造成了在对话中关闭的话就会卡住……
作者: 御风天之痕    时间: 2009-2-16 00:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: swabwind    时间: 2009-2-16 02:38
发现了利用此功能的刷法……
逃跑之前存,失败就读,再失败再读,知道逃成功为止。
某些一次游戏下来只能答一次的难题,存后答。
抽奖时存档……  


没错,那就是老玩家常用用“神器”SL大法,我以前也是这么玩的~呵呵
夏娜总是做出很实用的脚本。总能给我带来惊喜~{/tp}
作者: hide秀    时间: 2009-2-17 15:13
我最爱的 怨念系列 又出拉{/cy}
这强大的玩意儿终于完成了
PS:我终于归来了{/hx}
作者: ondine    时间: 2009-2-17 17:13
以下引用hide秀于2009-2-17 7:13:44的发言:

我最爱的 怨念系列 又出拉
这强大的玩意儿终于完成了
PS:我终于归来了


[本贴由作者于 2009-2-17 7:14:54 最后编辑]

欢迎归来= =
夏娜半夜跑上来发的- =
作者: 灼眼的夏娜    时间: 2009-2-17 19:39
以下引用hide秀于2009-2-17 7:13:44的发言:

我最爱的 怨念系列 又出拉
这强大的玩意儿终于完成了
PS:我终于归来了


[本贴由作者于 2009-2-17 7:14:54 最后编辑]

欢迎归来- - 这个东西V1.3好了= = 还没更新咳咳- -

以下引用ondine于2009-2-17 9:13:19的发言:
欢迎归来= =
夏娜半夜跑上来发的- =

= =起始昨天半夜没发 - -\\
作者: ondine    时间: 2009-2-17 20:13
以下引用灼眼的夏娜于2009-2-17 11:39:39的发言:


以下引用hide秀于2009-2-17 7:13:44的发言:

我最爱的 怨念系列 又出拉
这强大的玩意儿终于完成了
PS:我终于归来了


[本贴由作者于 2009-2-17 7:14:54 最后编辑]


欢迎归来- - 这个东西V1.3好了= = 还没更新咳咳- -


以下引用ondine于2009-2-17 9:13:19的发言:
欢迎归来= =
夏娜半夜跑上来发的- =


= =起始昨天半夜没发 - -\\

/~~飞。。。
作者: 灼眼的夏娜    时间: 2009-2-18 05:25
- -PIA飞楼上= =

更新v1.3= =
作者: 沉影不器    时间: 2009-2-18 05:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 灼眼的夏娜    时间: 2009-2-18 06:10
以下引用沉影不器于2009-2-17 21:57:46的发言:

哇,发现强大的东西了
即是说给所有游戏里用到的类都写好Marshal_dump这样子?那么transition的时候怎么记录呢?

基本上的类都不需要写。。ruby层面的类大多数默认都可以marshal的。。。

由于transition没法影响Input.update。。 所以没法记录。。 因为 就算是所谓的即时存档。。 在RGSS中也得相应按键信息。。这里的按键信息是截取的游戏场景主循环的 Input.update处进行存档的。。
作者: 沉影不器    时间: 2009-2-18 06:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 灼眼的夏娜    时间: 2009-2-18 06:21
以下引用沉影不器于2009-2-17 22:17:34的发言:

正想测试transition...
早期版本是直接保存位图矩阵是吧...如今改成*arg了...真是好办法
--------------------------------
我想请问Scene_Base有什么作用?


DIRECT_DUMP_IMAGE_DATA  = false 这个改为ture就是直接存储像素= =

最新版本确实改了 添加了其他几个参数 args是 所有类都有的。。= =
Scene_Base- -这里没有 ORZ 刚开始打算写个 场景模板- - 后来放弃了= =bb
作者: 沉影不器    时间: 2009-2-18 06:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: yue    时间: 2009-2-18 06:29
为什么出现BUG的几率会更大……
如果那样的话……不好……

语言贫乏了……
现在就是问,如果全部都是商业素材的游戏,存起来会不会很卡?会不会出现直接退出或者脚本备份的错误?
作者: 灼眼的夏娜    时间: 2009-2-18 06:41
以下引用yue于2009-2-17 22:29:05的发言:

为什么出现BUG的几率会更大……
如果那样的话……不好……

语言贫乏了……
现在就是问,如果全部都是商业素材的游戏,存起来会不会很卡?会不会出现直接退出或者脚本备份的错误?

以前直接存储图像数据简单容易。。但速度慢 存储文件大。。 最新版本改为存储位图操作步骤,淡然存储文件会小很多很多 速度也很几十倍。。但 有可能造成脚本冲突等 所以出现bug的几率会更大 当然 虽然更大 = = 那也是很小的可能。。= =

最新版本不会存储图像数据 所以不论是否是商业游戏素材 也不会卡的。。

作者: yue    时间: 2009-2-19 06:09
以下引用灼眼的夏娜于2009-2-17 22:41:02的发言:



以前直接存储图像数据简单容易。。但速度慢 存储文件大。。 最新版本改为存储位图操作步骤,淡然存储文件会小很多很多 速度也很几十倍。。但 有可能造成脚本冲突等 所以出现bug的几率会更大 当然 虽然更大 = = 那也是很小的可能。。= =

最新版本不会存储图像数据 所以不论是否是商业游戏素材 也不会卡的。。



[本贴由作者于 2009-2-17 22:41:14 最后编辑]

明白了,谢谢嗒~
作者: 灼眼的夏娜    时间: 2009-2-20 05:30
以下引用凌辰于2009-2-15 12:14:33的发言:

这样的话,就可以做到剧情进行时存档?
像AVG那样么……也好。
当年玩黑剑时剧情到一半我妈叫吃饭,等剧情完等很久- -

= = 恩 是的。。

1.4更新- -XD
作者: fysmrb    时间: 2009-3-7 08:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: ONEWateR    时间: 2009-3-15 17:57
发布完毕
http://rpg.blue/web/htm/news1242.htm
vip += 5
作者: 小小大恶魔    时间: 2009-3-15 22:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 玄月    时间: 2009-4-1 14:21
怎么自动存档都这么复杂了…………
作者: wyongcan2008    时间: 2009-4-19 20:43
在那个播放动画的地方存档,再读档,本来要播放的声音就没了。
作者: 灼眼的夏娜    时间: 2009-4-20 03:27
以下引用wyongcan2008于2009-4-19 12:43:26的发言:

在那个播放动画的地方存档,再读档,本来要播放的声音就没了。

xp默认Audio没法设置播放位置的 故默认的声音系统无法存档。。
作者: clande    时间: 2009-4-20 05:05
那个……我更希望出现工程定时存档的功能= =a

这个似乎脚本无法解决  拍拍拍!
作者: 奶油Da蛋糕    时间: 2009-10-4 22:48
可能这东西会有危险性。比如说,存档存一半停电了,数据还没写完整,会怎样呢?
作者: 937265088    时间: 2010-8-20 22:56
能不能每次存档都按F5,直接像网络游戏一样,不用存档退出就自动存档???





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