今天没事整理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则会调用该组函数进行存储和读取。
此脚本难度应该还是比较大的,不过有一定脚本基础熟悉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
这几个问题感兴趣的可以考虑下为什么,如果不可以会有啥问题。最后不明白的可以问偶= =
遁·
|