Project1

标题: 求助!怎么实现存档导入 [打印本页]

作者: 殇阳    时间: 2010-12-13 21:20
标题: 求助!怎么实现存档导入
就是之前的游戏的存档,因为更新而把存档导入到新的游戏中
酱紫可以么?或者补丁???
作者: 白鬼    时间: 2010-12-14 01:53
本帖最后由 白鬼 于 2010-12-14 02:25 编辑

你的意思是,新版本游戏沿用老存档
这样做的话有两种选择方式:
一是全部沿用
这种状况下,要求你新的版本所有的开关、变量、物品、装备、人物、技能、地图、地图上事件,都要延续老版本的内容
你只能启用新的开关、变量、物品装备人物技能等等
这样做很方便,但是随着你的内容增加,游戏容量将会越来越大

第二种是部分沿用
比如只沿用之前的人物,某个特定物品,某个特殊开关等等

具体方法,楼主自行选择
以上是思路,以下是部分沿用的实现方法:
============================
  1. Scene_Load
复制代码
是读取存档的脚本,来看看系统是怎么读取存档内容的:
在64行以下:
  1.     # 读取各种游戏对像
  2.     $game_system        = Marshal.load(file)       #系统
  3.     $game_switches      = Marshal.load(file)       #开关
  4.     $game_variables     = Marshal.load(file)      #变量
  5.     $game_self_switches = Marshal.load(file)      #独立变量
  6.     $game_screen        = Marshal.load(file)      #更改色调以及画面闪烁等
  7.     $game_actors        = Marshal.load(file)      #角色
  8.     $game_party         = Marshal.load(file)      #同伴
  9.     $game_troop         = Marshal.load(file)     #敌人队伍
  10.     $game_map           = Marshal.load(file)      #地图
  11.     $game_player        = Marshal.load(file)     
复制代码
我已经将上面内容加上了少量的注释,如果你是全部沿用,只管全部读取,如果是部分沿用,我注释的部分就足够你用了。
以延续角色为例,你要读取存档中的角色相关信息,要用到下面两个
  1. $game_actors        = Marshal.load(file)      #角色,包含角色的各种信息,姓名能力等
  2. $game_party         = Marshal.load(file)      #同伴,当前队伍中的角色
复制代码
其他部分可以不用读取,这时候模仿Scene_Title中的新游戏片段
  1. # 生成各种游戏对像
  2.     $game_temp          = Game_Temp.new
  3.     $game_system        = Game_System.new
  4.     $game_switches      = Game_Switches.new
  5.     $game_variables     = Game_Variables.new
  6.     $game_self_switches = Game_SelfSwitches.new
  7.     $game_screen        = Game_Screen.new
  8.     $game_actors        = Marshal.load(file)      #角色,包含角色的各种信息,姓名能力等
  9.     $game_party         = Marshal.load(file)      #同伴,当前队伍中的角色
  10.     $game_troop         = Game_Troop.new
  11.     $game_map           = Game_Map.new
  12.     $game_player        = Game_Player.new
复制代码
要注意,如果读取actor和party,那么你的角色id不能改。
数据能力倒是能改,但是改动的话,读取老存档出来的人物跟新建的人物,能力会不一样。

以上是读取部分的大致思路,下面要做读取老存档的核心了。
既然是读取存档,完全可以copy Scene_Load 的内容。
但是在定义的时候,要加以区别
比如你可以把读取老存档定义成 Scene_Loadold
完全复制 脚本,插入在mail之前,取名Scene_Loadold
  1. class Scene_Load < Scene_File
复制代码
改成
  1. class Scene_Loadold < Scene_File
复制代码
然后下面这部分:
  1. # 生成各种游戏对像
  2.     $game_temp          = Game_Temp.new   #这个内容没读取
  3.     $game_system        = Game_System.new   #这个内容没读取
  4.     $game_switches      = Game_Switches.new   #这个内容没读取
  5.     $game_variables     = Game_Variables.new   #这个内容没读取
  6.     $game_self_switches = Game_SelfSwitches.new   #这个内容没读取
  7.     $game_screen        = Game_Screen.new   #这个内容没读取
  8.     $game_actors        = Marshal.load(file)      #读取角色,包含角色的各种信息,姓名能力等
  9.     $game_party         = Marshal.load(file)      #读取同伴,当前队伍中的角色
  10.     $game_troop         = Game_Troop.new   #这个内容没读取
  11.     $game_map           = Game_Map.new   #这个内容没读取
  12.     $game_player        = Game_Player.new   #这个内容没读取
复制代码
还有一点需要修改。这两个load部分都在读取存档文件,所以要在文件名上加以修改。
比如你可以提出要求,想继承老存档中角色的话,要把想要继承的存档名字改成 "oldSave*.rxdata"?代表数字
那么,
  1.       filename = "old"+make_filename(i)
复制代码
#我不太确定直接这么+上去好不好用,试一下吧。

接下来就是如何让这个功能发挥作用了
然后要把这个操作加入到title里面,也就是加入到标题中
模仿继续的部分制作如下:

  1. #--------------------------------------------------------------------------
  2.   # ● 命令 : 读取老存档
  3.   #--------------------------------------------------------------------------
  4.   def command_continue
  5.     # 继续无效的情况下
  6.     unless @continue_enabled
  7.       # 演奏无效 SE
  8.       $game_system.se_play($data_system.buzzer_se)
  9.       return
  10.     end
  11.     # 演奏确定 SE
  12.     $game_system.se_play($data_system.decision_se)
  13.     # 切换到读档画面
  14.     $scene = Scene_Loadold.new   #修改了这里哦!
  15.   end
复制代码
光加入title还不行,还要做个开启这个功能的按钮
  1. # 生成命令窗口
  2.     s1 = "新游戏"
  3.     s2 = "继续"
  4.     s3 = "退出"
复制代码
这里只有三个命令,那么我们再给他添加一个
  1. s4 = "读取老存档"
复制代码
#当然,取什么名字你自己思量
然后在def update的部分,when 2 后面加上:
  1. when 3  # 读取老存档
  2.         continue_old_game
复制代码
特别说明,我这个是乱序的,你可以在做好了核心内容之后再自己慢慢调整。包括窗口位置,大小和选项顺序等等。
选项顺序改变的话,def update中的 when 0...when 3 下面内容的顺序也要对应!



以上就是大致思路了,我一时手痒就写了这么多,希望你能仔细的看一看,加入你真的对RM有兴趣的话。
而且这也有助于你去学习和理解其他的原始脚本。
只有了解了才有可能去修改,进而达到写个脚本出来的程度。

当然,我是一时兴起写这么点东西,这并不是完善的脚本,我也没有做工程,但是如果你看懂了,可以试着做一做。
我不保证直接就成功呢,估计会有一些小毛病,或者不方便的地方。
但是如果上面的内容看懂了,你就能根据脚本自己修改一下了。
还可以添枝加叶
比如,先判断是否有oldsave存档,如果有,直接就读取这个存档进入游戏
判断存档是否存在:方法在title中就有
  1. if FileTest.exist?("Save#{i+1}.rxdata")
复制代码
这一段,看懂之后模仿一下
如果没有,再title,当然这时候title里面就不需要加入读取oldsave的部分了
还有,如果你想读取开关和变量,还要进一步做些东西才不至于占用太多不需要的东西。

总之,如果有兴趣做下去,遇到什么问题可以找我。我忽然兴起决定帮到底~~~~



作者: 殇阳    时间: 2010-12-17 22:03
话说能不能说简单点,,,,,,,,,
我想要的是第二种
看了你的思路,以为是做法, 最后看到思路   我蒙了
我是脚本盲




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1