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

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

即时存档 v1.4

2009-3-15 09:22| 发布者: ONEWateR| 查看: 4052| 评论: 0|原作者: 灼眼的夏娜|来自: 点此进入发布帖

摘要: 今天没事整理RM工程的时候发现以前留下的一个坑 于是填补之~~~ XD  = =即时存档 v1.0(所谓即时存档也就是每帧都可以存档- -废话><) F5  # 存档F6  # 读档F7  # 增加存档编号F8
今天没事整理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

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

遁·
1

鲜花

刚表态过的朋友 (1 人)

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

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

GMT+8, 2024-5-4 22:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部