Project1

标题: 如何在一个rxdata文件中保存多个变量? [打印本页]

作者: wolves    时间: 2014-5-18 11:19
标题: 如何在一个rxdata文件中保存多个变量?
如何在一个rxdata文件中保存多个变量?我试着用下列脚本,但变量31、32最终的值都是200,说明是xx.rxdata被二次赋值了,也就是说只能储存一个变量,如何储存多个变量呢?
  1. $game_variables[31]=500
  2. $game_variables[32]=200
  3. save_data($game_variables[31], xx.rxdata)
  4. save_data($game_variables[32], xx.rxdata)
  5. $game_variables[31] = load_data(xx.rxdata)
  6. $game_variables[32] = load_data(xx.rxdata)
复制代码

作者: 克莉丝    时间: 2014-5-18 12:01
纠正用语:说明是xx.rxdata被二次赋值了     在此处应当是覆盖

翻到默认脚本Scene_Load页往下看
  1. #--------------------------------------------------------------------------
  2.   # ● 读取存档数据
  3.   #     file : 读取用文件对像 (已经打开)
  4.   #--------------------------------------------------------------------------
  5.   def read_save_data(file)
  6.     # 读取描绘存档文件用的角色数据
  7.     characters = Marshal.load(file)
  8.     # 读取测量游戏时间用画面计数
  9.     Graphics.frame_count = Marshal.load(file)
  10.     # 读取各种游戏对像
  11.     $game_system        = Marshal.load(file)
  12.     $game_switches      = Marshal.load(file)
  13.     $game_variables     = Marshal.load(file)
  14.     $game_self_switches = Marshal.load(file)
  15.     $game_screen        = Marshal.load(file)
  16.     $game_actors        = Marshal.load(file)
  17.     $game_party         = Marshal.load(file)
  18.     $game_troop         = Marshal.load(file)
  19.     $game_map           = Marshal.load(file)
  20.     $game_player        = Marshal.load(file)
  21.     # 魔法编号与保存时有差异的情况下
  22.     # (加入编辑器的编辑过的数据)
  23.     if $game_system.magic_number != $data_system.magic_number
  24.       # 重新装载地图
  25.       $game_map.setup($game_map.map_id)
  26.       $game_player.center($game_player.x, $game_player.y)
  27.     end
  28.     # 刷新同伴成员
  29.     $game_party.refresh
  30.   end
  31. end
复制代码
file为之前生成的文件对象
  1. # 读取存档数据
  2.     file = File.open(filename, "rb")
  3.     read_save_data(file)
复制代码
那么这个文件是怎么生成的呢
我们再把脚本翻到Scene_Save这一页
  1.   #--------------------------------------------------------------------------
  2.   # ● 写入存档数据
  3.   #     file : 写入用文件对像 (已经打开)
  4.   #--------------------------------------------------------------------------
  5.   def write_save_data(file)
  6.     # 生成描绘存档文件用的角色图形
  7.     characters = []
  8.     for i in 0...$game_party.actors.size
  9.       actor = $game_party.actors[i]
  10.       characters.push([actor.character_name, actor.character_hue])
  11.     end
  12.     # 写入描绘存档文件用的角色数据
  13.     Marshal.dump(characters, file)
  14.     # 写入测量游戏时间用画面计数
  15.     Marshal.dump(Graphics.frame_count, file)
  16.     # 增加 1 次存档次数
  17.     $game_system.save_count += 1
  18.     # 保存魔法编号
  19.     # (将编辑器保存的值以随机值替换)
  20.     $game_system.magic_number = $data_system.magic_number
  21.     # 写入各种游戏对像
  22.     Marshal.dump($game_system, file)
  23.     Marshal.dump($game_switches, file)
  24.     Marshal.dump($game_variables, file)
  25.     Marshal.dump($game_self_switches, file)
  26.     Marshal.dump($game_screen, file)
  27.     Marshal.dump($game_actors, file)
  28.     Marshal.dump($game_party, file)
  29.     Marshal.dump($game_troop, file)
  30.     Marshal.dump($game_map, file)
  31.     Marshal.dump($game_player, file)
  32.   end
复制代码
通过比较默认脚本的读写、你能得出什么结论

结论就是、用save_data无法达到这个目的

因此,你需要了解Marshal这个模块

引用自自带帮助文档
Marshal
您可以使用该模块把 Ruby 对象写入文件(或字符串)保存起来,或者重新读取并生成该对象。

模块函数Marshal.dump(obj[, port][, limit])
把 obj 递归地写入文件。

File 和 MatchData 的实例,定义了特殊方法的对象等,不能被写入文件。若对这些不能被写入文件的对象使用该函数时,会引发 TypeError 异常。

可以向 port 指定一个 IO(或其子类)的实例。此时将返回 port。缺省时 dump 会返回保存着对象的字符串。

若使用了 limit 时,将只会保存 limit 层以内的关联对象(默认值为100层)。若将 limit 指定为负值时,将不会进行层数检查。

Marshal.load(port)
从 port 读入 marshal 数据(Marshal.dump 输出的的字符串)后生成一个与原对象状态相同的对象。port 可以是字符串或 IO(或其子类)的实例。


当然针对这个问题你不需要这么复杂

写入

  1. file = File.open("xx.rxdata","wb")
  2. $game_variables[31]=500
  3. $game_variables[32]=200
  4. Marshal.dump($game_variables[31],file)
  5. Marshal.dump($game_variables[32],file)
  6. file.close
复制代码
读取

  1. file = File.open("xx.rxdata","rb")
  2. $game_variables[31] = Marshal.load(file)
  3. $game_variables[32] = Marshal.load(file)
复制代码

作者: wolves    时间: 2014-5-18 12:36
懂了,应该用file语句而不能用save。
作者: 克莉丝    时间: 2014-5-18 12:51
wolves 发表于 2014-5-18 12:36
懂了,应该用file语句而不能用save。

你的脚本使用在哪里




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