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

Project1

 找回密码
 注册会员
搜索
查看: 23600|回复: 40
打印 上一主题 下一主题

[原创发布] [怨念的产物]即时存档 v1.4 更新

 关闭 [复制链接]

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
跳转到指定楼层
1
发表于 2009-2-15 20:01:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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

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


点击下载范例工程

范例工程附带存档一个,在标题画面按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的时候
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

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

遁·
RMXP&amp;RMVX通用Web化完成- -|||

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
2
发表于 2009-2-15 20:04:48 | 只看该作者
每帧都可以存档....这样不卡吗...

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
3
 楼主| 发表于 2009-2-15 20:06:19 | 只看该作者
以下引用霜冻之狼于2009-2-15 12:04:48的发言:

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

- -每帧都可以存档 不是每帧都存档- - 热键存档- -><
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人


梦石
0
星屑
89
在线时间
24 小时
注册时间
2006-5-27
帖子
11425

贵宾

4
发表于 2009-2-15 20:07:01 | 只看该作者
如果是非正常退出也能存下来?
那就太好了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
5
发表于 2009-2-15 20:09:15 | 只看该作者
........这样不太好吧
比如刚好播放动画或者改变画面色调的时候,玩家就存档...
然后再读档玩,会发现这两个命令失效了...

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

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
6
 楼主| 发表于 2009-2-15 20:11:38 | 只看该作者
以下引用凌辰于2009-2-15 12:07:01的发言:

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

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

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

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

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


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

读档依然是刚播放动画 刚改变色调的时候的。。。= =
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人


梦石
0
星屑
89
在线时间
24 小时
注册时间
2006-5-27
帖子
11425

贵宾

7
发表于 2009-2-15 20:14:33 | 只看该作者
这样的话,就可以做到剧情进行时存档?
像AVG那样么……也好。
当年玩黑剑时剧情到一半我妈叫吃饭,等剧情完等很久- -
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-9-24
帖子
409
8
发表于 2009-2-15 20:14:37 | 只看该作者
以下引用灼眼的夏娜于2009-2-15 12:11:38的发言:


以下引用凌辰于2009-2-15 12:07:01的发言:

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


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


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

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

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


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


读档依然是刚播放动画 刚改变色调的时候的。。。= =


看来很强大
下载看看……
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
9
发表于 2009-2-15 20:20:45 | 只看该作者
以下引用灼眼的夏娜于2009-2-15 12:11:38的发言:
读档依然是刚播放动画 刚改变色调的时候的。。。= =

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

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
10
 楼主| 发表于 2009-2-15 20:21:34 | 只看该作者
以下引用霜冻之狼于2009-2-15 12:20:45的发言:


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

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

- -测试过了。。。 可以的啊- -
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-16 06:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表