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

Project1

 找回密码
 注册会员
搜索
查看: 23717|回复: 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
星屑
545
在线时间
0 小时
注册时间
2010-8-5
帖子
1
41
发表于 2010-8-20 22:56:51 | 只看该作者
能不能每次存档都按F5,直接像网络游戏一样,不用存档退出就自动存档???
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
40
发表于 2009-10-4 22:48:02 | 只看该作者
可能这东西会有危险性。比如说,存档存一半停电了,数据还没写完整,会怎样呢?
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

简史

梦石
0
星屑
120
在线时间
422 小时
注册时间
2008-7-4
帖子
736

开拓者

39
发表于 2009-4-20 05:05:30 | 只看该作者
那个……我更希望出现工程定时存档的功能= =a

这个似乎脚本无法解决  拍拍拍!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
38
 楼主| 发表于 2009-4-20 03:27:26 | 只看该作者
以下引用wyongcan2008于2009-4-19 12:43:26的发言:

在那个播放动画的地方存档,再读档,本来要播放的声音就没了。

xp默认Audio没法设置播放位置的 故默认的声音系统无法存档。。
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
810
在线时间
173 小时
注册时间
2008-11-22
帖子
112
37
发表于 2009-4-19 20:43:26 | 只看该作者
在那个播放动画的地方存档,再读档,本来要播放的声音就没了。
又不知道干什么好了。。。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
95
在线时间
380 小时
注册时间
2006-10-16
帖子
4299

贵宾

36
发表于 2009-4-1 14:21:22 | 只看该作者
怎么自动存档都这么复杂了…………
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

UltraDevil

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-3-9
帖子
262
35
发表于 2009-3-15 22:27:56 | 只看该作者
这个……收藏~
我记得有一个脚本是关闭程序就存档,不过好像有点儿问题……这种脚本我比较有爱
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
34
发表于 2009-3-15 17:57:13 | 只看该作者
发布完毕
http://rpg.blue/web/htm/news1242.htm
vip += 5
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-1-14
帖子
23
33
发表于 2009-3-7 08:54:46 | 只看该作者
这个东西看上去好强大!留名
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-29 13:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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