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

Project1

 找回密码
 注册会员
搜索
查看: 22597|回复: 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
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
2
 楼主| 发表于 2009-2-15 20:06:19 | 显示全部楼层
以下引用霜冻之狼于2009-2-15 12:04:48的发言:

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

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

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
3
 楼主| 发表于 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
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
4
 楼主| 发表于 2009-2-15 20:21:34 | 显示全部楼层
以下引用霜冻之狼于2009-2-15 12:20:45的发言:


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

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

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

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
5
 楼主| 发表于 2009-2-15 23:30:12 | 显示全部楼层
以下引用小柯于2009-2-15 15:26:44的发言:

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



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


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


默认的存档事件运行中无法存档的。。。 该存档保证在任何情况下 包括对话文字刚显示一个字 动画刚播放一半等情况都可以存档= =
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
6
 楼主| 发表于 2009-2-17 19: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的发言:
欢迎归来= =
夏娜半夜跑上来发的- =

= =起始昨天半夜没发 - -\\
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
7
 楼主| 发表于 2009-2-18 05:25:09 | 显示全部楼层
- -PIA飞楼上= =

更新v1.3= =
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
8
 楼主| 发表于 2009-2-18 06:10:37 | 显示全部楼层
以下引用沉影不器于2009-2-17 21:57:46的发言:

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

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

由于transition没法影响Input.update。。 所以没法记录。。 因为 就算是所谓的即时存档。。 在RGSS中也得相应按键信息。。这里的按键信息是截取的游戏场景主循环的 Input.update处进行存档的。。
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
9
 楼主| 发表于 2009-2-18 06:21:01 | 显示全部楼层
以下引用沉影不器于2009-2-17 22:17:34的发言:

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


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

最新版本确实改了 添加了其他几个参数 args是 所有类都有的。。= =
Scene_Base- -这里没有 ORZ 刚开始打算写个 场景模板- - 后来放弃了= =bb
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
10
 楼主| 发表于 2009-2-18 06:41:02 | 显示全部楼层
以下引用yue于2009-2-17 22:29:05的发言:

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

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

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

最新版本不会存储图像数据 所以不论是否是商业游戏素材 也不会卡的。。
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-3 22:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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