赞 | 1 |
VIP | 1647 |
好人卡 | 10 |
积分 | 1 |
经验 | 363065 |
最后登录 | 2016-8-26 |
在线时间 | 1707 小时 |
Lv1.梦旅人 炎发灼眼的讨伐者
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 1707 小时
- 注册时间
- 2007-8-4
- 帖子
- 904
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
今天没事整理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
点击下载范例工程
范例工程附带存档一个,在标题画面按F6读档,可以到战斗画面。= =
此脚本难度应该还是比较大的,不过有一定脚本基础熟悉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的时候
的调用
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
这几个问题感兴趣的可以考虑下为什么,如果不可以会有啥问题。最后不明白的可以问偶= =
遁· |
|