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

Project1

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

[已经解决] 如何将数据写入存档

[复制链接]

Lv4.逐梦者

梦石
7
星屑
1113
在线时间
334 小时
注册时间
2008-1-28
帖子
1566
跳转到指定楼层
1
发表于 2016-1-12 11:04:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 未命名 于 2016-1-14 23:34 编辑

请问要如何写入部分数据(比如说变量,开关等)写入存档?

我的游戏中,主角在一段剧情之后就来到一个基地,然后以基地为中心到不同迷宫探险,而迷宫中不能存档,只能在基地存档。
但我想要实现在迷宫中获得道具(依然是变量),或是触发了什么事件后,能够将数据写入存档。这样就能避免玩家在没有回到基地的情况下退出游戏,导致迷宫中探险的进度消失。
于是我想每次载入存档时,主角将在默认的地点(基地)出现,然而迷宫的进程依然有记录。
所以需要的是只要将发生改变的数据(变量开关)写入存档,其他保持不变就可以了。
自己试过的一些方法


目前这个效果的实现不是很重要,只要保证玩家正常返回就可以,而且也可以用上面那些“不正式”的方法,
但是我依然希望能够实现这样的效果,可能将来会用到。

同时我也希望能够收集些其他“不正试”的方法去实现相同的效果,所以有什么想法都可以提出来。
终于有可以放在这里的游戏了……
极短13 新生 《箱子新世界》

Lv3.寻梦者

梦石
0
星屑
1759
在线时间
2524 小时
注册时间
2010-10-12
帖子
1454

开拓者

2
发表于 2016-1-12 11:25:14 | 只看该作者
  1. #==============================================================================
  2. # ■ Scene_Load
  3. #------------------------------------------------------------------------------
  4. #  处理读档画面的类。
  5. #==============================================================================

  6. class Scene_Load < Scene_File
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.     # 再生成临时对像
  12.     $game_temp = Game_Temp.new
  13.     # 选择存档时间最新的文件
  14.     $game_temp.last_file_index = 0
  15.     latest_time = Time.at(0)
  16.     for i in 0..3
  17.       filename = make_filename(i)
  18.       if FileTest.exist?(filename)
  19.         file = File.open(filename, "r")
  20.         if file.mtime > latest_time
  21.           latest_time = file.mtime
  22.           $game_temp.last_file_index = i
  23.         end
  24.         file.close
  25.       end
  26.     end
  27.     super("要载入哪个文件?")
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 确定时的处理
  31.   #--------------------------------------------------------------------------
  32.   def on_decision(filename)
  33.     # 文件不存在的情况下
  34.     unless FileTest.exist?(filename)
  35.       # 演奏冻结 SE
  36.       $game_system.se_play($data_system.buzzer_se)
  37.       return
  38.     end
  39.     # 演奏读档 SE
  40.     $game_system.se_play($data_system.load_se)
  41.     # 写入存档数据
  42.     file = File.open(filename, "rb")
  43.     read_save_data(file)
  44.     file.close
  45.     # 还原 BGM、BGS
  46.     $game_system.bgm_play($game_system.playing_bgm)
  47.     $game_system.bgs_play($game_system.playing_bgs)
  48.     # 刷新地图 (执行并行事件)
  49.     $game_map.update
  50.     # 切换到地图画面
  51.     $scene = Scene_Map.new
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 取消时的处理
  55.   #--------------------------------------------------------------------------
  56.   def on_cancel
  57.     # 演奏取消 SE
  58.     $game_system.se_play($data_system.cancel_se)
  59.     # 切换到标题画面
  60.     $scene = Scene_Title.new
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   # ● 读取存档数据
  64.   #     file : 读取用文件对像 (已经打开)
  65.   #--------------------------------------------------------------------------
  66.   def read_save_data(file)
  67.     # 读取描绘存档文件用的角色数据
  68.     characters = Marshal.load(file)
  69.     # 读取测量游戏时间用画面计数
  70.     Graphics.frame_count = Marshal.load(file)
  71.     # 读取各种游戏对像
  72.     $game_temp          = Game_Temp.new

  73.     $game_system        = Game_System.new
  74.     crap = Marshal.load(file)
  75.     $game_switches      = Marshal.load(file)
  76.     $game_variables     = Marshal.load(file)
  77.     $game_self_switches = Game_SelfSwitches.new
  78.    
  79.     $game_screen        = Game_Screen.new
  80.     $game_actors        = Game_Actors.new
  81.     $game_party         = Game_Party.new
  82.     $game_troop         = Game_Troop.new
  83.     $game_map           = Game_Map.new
  84.     $game_player        = Game_Player.new
  85.     # 设置初期同伴位置
  86.     $game_party.setup_starting_members
  87.     # 设置初期位置的地图
  88.     $game_map.setup($data_system.start_map_id)
  89.     # 主角向初期位置移动
  90.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  91.     # 刷新主角
  92.     $game_player.refresh
  93.     # 执行地图设置的 BGM 与 BGS 的自动切换
  94.     $game_map.autoplay

  95.    
  96.    
  97.    
  98.    
  99.     # 魔法编号与保存时有差异的情况下
  100.     # (加入编辑器的编辑过的数据)
  101.     if $game_system.magic_number != $data_system.magic_number
  102.       # 重新装载地图
  103.       $game_map.setup($game_map.map_id)
  104.       $game_player.center($game_player.x, $game_player.y)
  105.     end
  106.     # 刷新同伴成员
  107.     $game_party.refresh
  108.   end
  109.   
  110. end
复制代码
这个代码的功能是只每次读取村当时,只读取变量开关等数据,别的都以新游戏的标准开始。

不知道有帮助吗?

然后关于第二个问题,我还在看


点评

每当脚本运行Marshal.load(file)时,他只会按着这个顺序依次读取内容。 这里crap 并没有任何作用,但是只是为了把game_system读取出来。然后才能继续读取...   发表于 2016-1-12 14:22
额,是这样的,当你存档的时候。默认脚本是根据game_system, game_switches,game_variables,game_self_switches....一直到game_player的顺序存入的。  发表于 2016-1-12 14:19
脚本中的“crap = Marshal.load(file)”起到什么作用,为什么没有它变量就会失效?  发表于 2016-1-12 14:11
新工程运行没问题,但是我原游戏庞杂,还得修改。  发表于 2016-1-12 14:10
这是只读取部分,而其他内容直接用新游戏的数据?好吧,我没想过能这么干。  发表于 2016-1-12 11:34

评分

参与人数 2星屑 +40 梦石 +1 收起 理由
RyanBern + 1 认可答案
未命名 + 40 是个好方法。

查看全部评分


回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-8 11:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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