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

Project1

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

[已经解决] 如何在一个rxdata文件中保存多个变量?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
155
在线时间
332 小时
注册时间
2013-7-6
帖子
356
跳转到指定楼层
1
发表于 2014-5-18 11:19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如何在一个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)
复制代码

评分

参与人数 2星屑 +135 收起 理由
克莉丝 + 100 ↓小气版主咱不理他
︶ㄣ牛排ぶ + 35 手动认可奖励

查看全部评分

偶是熬夜学编程的傻子

Lv1.梦旅人

梦石
0
星屑
68
在线时间
585 小时
注册时间
2013-5-25
帖子
1524
2
发表于 2014-5-18 12:01:57 | 只看该作者
纠正用语:说明是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)
复制代码

点评

为什么会出现(eval):1:in 'initialize' xx.rxdata  发表于 2014-5-18 12:49

评分

参与人数 2星屑 +150 收起 理由
Vortur + 60 泪奔跪谢啊找了一晚上了都
︶ㄣ牛排ぶ + 90 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
155
在线时间
332 小时
注册时间
2013-7-6
帖子
356
3
 楼主| 发表于 2014-5-18 12:36:17 | 只看该作者
懂了,应该用file语句而不能用save。
偶是熬夜学编程的傻子
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
68
在线时间
585 小时
注册时间
2013-5-25
帖子
1524
4
发表于 2014-5-18 12:51:18 | 只看该作者
wolves 发表于 2014-5-18 12:36
懂了,应该用file语句而不能用save。

你的脚本使用在哪里

点评

sorry,我在整个脚本开头插入了这个代码,自己给忘了。。。 if FileTest.exist?("xx.rxdata") File.delete("xx.rxdata") end 谢谢你  发表于 2014-5-18 13:25
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-1 14:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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