查看: 4664|回复: 4

[已经解决] 如何在菜单 / 事件中一键存档 / 读档

[复制链接]
梦石
0
星屑
290
在线时间
3599 小时
注册时间
2012-2-29
回帖
3320

黄金编剧

发表于 2015-9-20 11:59:05 | 显示全部楼层 |阅读模式

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

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

×
{:2_270:} 我认为这是相互关联的一个功能,不知是否算一帖多问?
如果违反这方面的版规,请予以告知,我会立刻修改

①在菜单中一键存档
菜单:在游戏中按Esc键进入的菜单
键:默认菜单脚本给出的按键之一
在菜单中按下该键时,直接将当前游戏进度保存到一个固定的存档位置(或直接生成存档文件)

②在事件中一键读档
事件:一个并行处理的地图事件
键:用条件分歧设置的“确定”(C键)按钮
在事件中按下该键时,直接从那个固定的存档位置读档(或直接读取存档文件)

如何通过修改默认脚本 / 事件脚本分别达成这两项功能?
简化 高效 简约 便捷,为用户体验而思考。
头像被屏蔽
梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
回帖
3243
发表于 2015-9-20 13:37:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-9-20 14:31:36 | 显示全部楼层
本帖最后由 RyanBern 于 2015-9-20 14:35 编辑

有关一键存档的问题,其实在图书馆中已经有了提示,请参考图书馆【标题&存档&菜单问题】的第6条。
不过,由于楼主是想要在菜单上按某键存档,所以还要再改改才行。
插入第一段代码之后,需要插入以下代码:
[pre lang="Ruby"]class Scene_Menu
  alias rb_update_command_20150920 update_command
  def update_command
    if Input.trigger?(Input::Y)
      $game_system.se_play($data_system.save_se)
      save = Scene_Save.new
      save.autosave
      return
    end
    rb_update_command_20150920
  end
end[/pre]
这样,在菜单中,命令窗口激活时,按一下S键即可存档。
事件中读档也是一样的道理,不过要对上面存档的代码改装一下:
[pre lang="Ruby"]load_s = Scene_Load.new
load_s.on_decision("Save1.rxdata") # 注意,这里的文件名必须和存档的文件名一样
[/pre]
然后,使用公共事件,触发条件选择并行处理,并打开条件开关:
等待:1 帧
条件分歧:按钮 X 被按下时
  脚本:load_s = Scene_Load.new
            load_s.on_decision("Save1.rxdata")

  :分歧结束
这样,在地图上按下 A 键即可一键读档,因为按下 Space 键和一些指令冲突,所以我改成了 A 键,这个应该能自己调节。

点评

(╯‵□′)╯︵┻━┻被抢了  发表于 2015-9-20 15:22

评分

参与人数 1星屑 +200 收起 理由
·雾逝者· + 200 感谢!

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-9-20 14:40:06 | 显示全部楼层
唔。。。在窝噜工程的时候R君已经回答了……
嘛~思路不一样,虽然已经没必要,但是还是放这吧~
(菜单中A键存档,地图中S键读档,默认按键的话……也就是对应RM的X,Y键)
一键SL.zip (211.2 KB, 下载次数: 59)

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

发表于 2015-9-20 15:34:23 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-9-20 15:40 编辑

做出来了。_(:з」∠)_虽然被抢了但不想浪费。

功能:在菜单里点击“存档”时将直接将文件存到4号档位,在地图上按下W键直接读取4号档位。
QQ截图20150920153216.png

将此脚本插入到main前[pre lang="ruby"]#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  处理菜单画面的类。
#==============================================================================

class Scene_Menu
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴人数为 0、存档、游戏结束以外的场合
      if $game_party.actors.size == 0 and @command_window.index < 4
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令窗口的光标位置分支
      case @command_window.index
      when 0  # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $scene = Scene_Item.new
      when 1  # 特技
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # 存档
        # 禁止存档的情况下
        if $game_system.save_disabled
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
        end
        # 调用过程 on_decision (定义继承目标)
        on_decision(make_filename)
      when 5  # 游戏结束
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到游戏结束画面
        $scene = Scene_End.new
      end
      return
    end
  end
  def on_decision(filename)
    # 演奏存档 SE
    $game_system.se_play($data_system.save_se)
    # 写入存档数据
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    # 如果被事件调用
    if $game_temp.save_calling
      # 清除存档调用标志
      $game_temp.save_calling = false
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成文件名
  #     file_index : 文件名的索引 (0~3)
  #--------------------------------------------------------------------------
  def make_filename
    return "Save4.rxdata"
  end
  #--------------------------------------------------------------------------
  # ● 写入存档数据
  #     file : 写入用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def write_save_data(file)
    # 生成描绘存档文件用的角色图形
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      characters.push([actor.character_name, actor.character_hue])
    end
    # 写入描绘存档文件用的角色数据
    Marshal.dump(characters, file)
    # 写入测量游戏时间用画面计数
    Marshal.dump(Graphics.frame_count, file)
    # 增加 1 次存档次数
    $game_system.save_count += 1
    # 保存魔法编号
    # (将编辑器保存的值以随机值替换)
    $game_system.magic_number = $data_system.magic_number
    # 写入各种游戏对像
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end
class Interpreter
  #--------------------------------------------------------------------------
  # ● 确定时的处理
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # 文件不存在的情况下
    unless FileTest.exist?(filename)
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    # 写入存档数据
    file = File.open(filename, "rb")
    read_save_data(file)
    file.close
    # 还原 BGM、BGS
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    # 演奏读档 SE
    $game_system.se_play($data_system.load_se)
    $scene = Scene_Map.new
  end
  #--------------------------------------------------------------------------
  # ● 读取存档数据
  #     file : 读取用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def read_save_data(file)
    # 读取描绘存档文件用的角色数据
    characters = Marshal.load(file)
    # 读取测量游戏时间用画面计数
    Graphics.frame_count = Marshal.load(file)
    # 读取各种游戏对像
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables     = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party         = Marshal.load(file)
    $game_troop         = Marshal.load(file)
    $game_map           = Marshal.load(file)
    $game_player        = Marshal.load(file)
    # 魔法编号与保存时有差异的情况下
    # (加入编辑器的编辑过的数据)
    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
  end
  #--------------------------------------------------------------------------
  # ● 生成文件名
  #     file_index : 文件名的索引 (0~3)
  #--------------------------------------------------------------------------
  def make_filename
    return "Save4.rxdata"
  end
end[/pre]

点评

╮(╯_╰)╭随便吧,我也只是初学者而已  发表于 2015-9-20 17:03
可以不用重新定义Scene_Menu的,只要在需要的地方重定义就可了吧?  发表于 2015-9-20 17:02

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部