目前共有6篇帖子。 內容轉換:不轉換▼
 
點擊 回復
1153 5
【教程】给一个RMXP工程加上多文件存档功能
一派護法 十九級
1樓 發表于:2013-7-7 16:42
本文章详细讲解如何对RMXP工程加上多文件存档功能,并将转换现有的存档。
如果你是用的魔塔样板做的,就不要看这篇文章了。这篇文章的内容只能在纯RMXP新建的工程下使用,在魔塔样板下使用会出错的(主要是开关4的问题),况且现在所有的魔塔样板都已经有这个功能了。
首先要明确的一点是,存档文件的保存位置。默认rmxp新建的工程(简称R工程)存档文件只能有4个,而且还存在工程根目录下的。由于我们要设置多文件的存档,所以防在根目录下很麻烦。因此,我们把存档文件都放在单独的一个文件夹中——Save文件夹。
为了防止玩家从其他魔塔中存档,并把该存档复制到本游戏来作弊,所以我们增加了密钥的功能。注意每个游戏的密钥最好不要相同。
在脚本编辑器中新加一个脚本■protect savefile,内容:
一派護法 十九級
2樓 發表于:2013-7-7 16:44
#==============================================================================
# ☆★☆ Custom Save☆★☆
#------------------------------------------------------------------------------
# - FantasyDR
#------------------------------------------------------------------------------
# MSN: [email]FantasyDR_SJL@hotmail.com[/email]
#------------------------------------------------------------------------------
# - 2006.7.18
#------------------------------------------------------------------------------
# 自定义存档数据排列顺序并校验存档
#==============================================================================
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  存档画面及读档画面的超级类。
#==============================================================================
class Scene_File
#--------------------------------------------------------------------------
# ● 存档密钥,请定义成自己的密钥
#   密钥不同的存档将无法被读取
#--------------------------------------------------------------------------
SAVE_KEY = 3975
#发布自己的魔塔游戏时,请一定要把上面的数字换掉
#--------------------------------------------------------------------------
# ● 常量 (存档页数)
#--------------------------------------------------------------------------
MaxPages = 8
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #     help_text : 帮助窗口显示的字符串
 #--------------------------------------------------------------------------
 def initialize(help_text)
   @help_text = help_text
   @slots = MaxPages * 4
 end
 #--------------------------------------------------------------------------
 # ● 主处理
 #--------------------------------------------------------------------------
 def main
   # 生成帮助窗口
   @help_window = Window_Help.new
   @help_window.set_text(@help_text)
   @file_index = $game_temp.last_file_index
   # 生成存档文件窗口
   @savefile_windows = []
   # 选择最后操作的文件
   for i in @file_index / 4 * 4..@file_index / 4 * 4 + 3
     load_window(i)
     @savefile_windows[i].visible = true
   end
   @savefile_windows[@file_index].selected = true
   # 执行过渡
   Graphics.transition
   # 主循环
   loop do
     # 刷新游戏画面
     Graphics.update
     # 刷新输入信息
     Input.update
     # 刷新画面
     update
     # 如果画面被切换的话就中断循环
     if $scene != self
       break
     end
   end
  
# 准备过渡
  Graphics.freeze
  # 释放窗口
  @help_window.dispose
  for i in 0...@slots
    @savefile_windows[i].dispose if @savefile_windows[i] != nil
  end
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
  # 刷新窗口
  @help_window.update
  for i in @file_index / 4 * 4..@file_index / 4 * 4 + 3
    @savefile_windows[i].update if @savefile_windows[i].visible
  end
   # 按下 C 键的情况下
   if Input.trigger?(Input::C)
     # 调用过程 on_decision (定义继承目标)
     on_decision(make_filename(@file_index))
     $game_temp.last_file_index = @file_index
     return
   end
   # 按下 B 键的情况下
   if Input.trigger?(Input::B)
     # 调用过程 on_cancel (定义继承目标)
     on_cancel
     return
   end
   # 按下方向键下的情况下
   if Input.repeat?(Input::DOWN)
     # 演奏光标 SE
     $game_system.se_play($data_system.cursor_se)
     # 光标向下移动
     @savefile_windows[@file_index].selected = false
     @file_index = (@file_index + 1) % @slots
     # 翻到下一页的情况下
     if @file_index % 4 == 0
       for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
         @savefile_windows[(index + @slots - 4) % @slots].visible = false
         load_window(index)
         @savefile_windows[index].visible = true
       end
     end
     @savefile_windows[@file_index].selected = true
     return
   end
   # 按下方向键上的情况下
   if Input.repeat?(Input::UP)
     # 演奏光标 SE
     $game_system.se_play($data_system.cursor_se)
     # 光标向上移动
     @savefile_windows[@file_index].selected = false
     @file_index = (@file_index + @slots - 1) % @slots
     # 翻到上一页的情况下
     if @file_index % 4 == 3
       for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
         @savefile_windows[(index + 4) % @slots].visible = false
         load_window(index)
         @savefile_windows[index].visible = true
       end
     end
     @savefile_windows[@file_index].selected = true
     return
   end
   # 按下方向键左或者 L 的情况下
   if Input.repeat?(Input::LEFT) or Input.trigger?(Input::L)
     # 演奏光标 SE
     $game_system.se_play($data_system.cursor_se)
     # 前翻一页
     @savefile_windows[@file_index].selected = false
     @file_index = (@file_index + @slots - 4) % @slots
     for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
       @savefile_windows[(index + 4) % @slots].visible = false
       load_window(index)
       @savefile_windows[index].visible = true
     end
     @savefile_windows[@file_index].selected = true
     return
   end
   # 按下方向键右或者 R 的情况下
   if Input.repeat?(Input::RIGHT) or Input.trigger?(Input::R)
     # 演奏光标 SE
     $game_system.se_play($data_system.cursor_se)
     # 前翻一页
     @savefile_windows[@file_index].selected = false
     @file_index = (@file_index + 4) % @slots
     for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
       @savefile_windows[(index + @slots - 4) % @slots].visible = false
       load_window(index)
       @savefile_windows[index].visible = true
     end
     @savefile_windows[@file_index].selected = true
     return
   end
 end
 #--------------------------------------------------------------------------
 # ● 生成文件名
 #     file_index : 文件名的索引 (0~n)
 #--------------------------------------------------------------------------
 def make_filename(file_index)
   return "Save/motaSave#{file_index + 1}.rxdata"
 end
 #--------------------------------------------------------------------------
 # ● 载入当前页存档
 #     避免因存档位过多造成的卡壳现象
 #--------------------------------------------------------------------------
 def load_window(i)
   if @savefile_windows[i] != nil
     return
   else
     @savefile_windows[i] = Window_SaveFile.new(i, make_filename(i))
   end
 end
end
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================
class Scene_Load < Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize()#save_max = SAVE_MAX)
  # 再生成临时对像
  $game_temp = Game_Temp.new
  # 选择存档时间最新的文件
  $game_temp.last_file_index = 0
  latest_time = Time.at(0)
  for i in 0..7
    filename = make_filename(i)
    if FileTest.exist?(filename)
    begin
      file = Zlib::GzipReader.open(filename)
    rescue
      next
    end
    if file.mtime > latest_time
      latest_time = file.mtime
      $game_temp.last_file_index = i
    end
    file.close
    end
  end
  super("要载入哪个文件?")#,"读取",save_max)
end
#--------------------------------------------------------------------------
# ● 确定时的处理
#--------------------------------------------------------------------------
def on_decision(filename)
  # 文件不存在的情况下
  unless FileTest.exist?(filename)
    # 演奏冻结 SE
    $game_system.se_play($data_system.buzzer_se)
    return
  end
  # 演奏读档 SE
  $game_system.se_play($data_system.load_se)
  # 写入存档数据
  begin
    file = Zlib::GzipReader.open(filename)
    read_save_data(file)
  rescue
    # 演奏冻结 SE
    $game_system.se_play($data_system.buzzer_se)
    return
  end
  file.close
  # 还原 BGM、BGS
  $game_system.bgm_play($game_system.playing_bgm)
  $game_system.bgs_play($game_system.playing_bgs)
  # 刷新地图 (执行并行事件)
  $game_map.update
  # 切换到地图画面
  $scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# ● 取消时的处理
#--------------------------------------------------------------------------
def on_cancel
  # 演奏取消 SE
  $game_system.se_play($data_system.cancel_se)
  # 切换到标题画面
  $scene = Scene_Title.new
end
#--------------------------------------------------------------------------
# ● 读取存档数据
#   file : 读取用文件对像 (已经打开)
#--------------------------------------------------------------------------
def read_save_data(file)
 
  $desc=Marshal.load(file) 
  # 读取描绘存档文件用的角色数据
  characters = Marshal.load(file)
  # 读取测量游戏时间用画面计数
  Graphics.frame_count = Marshal.load(file)
  # 读取校验
  crcs = Marshal.load(file)
  # 读取文档字串
  strings = Marshal.load(file)
  # 校验检测
  key = SAVE_KEY
  strings.each_index do |i|
    key = Zlib.crc32(strings[i],key)
    unless crcs[i] == key
    file.close
    raise "file check error"
    return
    end
  end
  # 读取各种游戏对像
  $game_system = Marshal.load(Zlib::Inflate.inflate(strings[0]))
  $game_variables = Marshal.load(Zlib::Inflate.inflate(strings[1]))
  $game_self_switches = Marshal.load(Zlib::Inflate.inflate(strings[2]))
  $game_switches = Marshal.load(Zlib::Inflate.inflate(strings[3]))
  $game_troop = Marshal.load(Zlib::Inflate.inflate(strings[4]))
  $game_map = Marshal.load(Zlib::Inflate.inflate(strings[5]))
  $game_player = Marshal.load(Zlib::Inflate.inflate(strings[6]))
  $game_screen = Marshal.load(Zlib::Inflate.inflate(strings[7]))
  $game_actors = Marshal.load(Zlib::Inflate.inflate(strings[8]))
  $game_party = Marshal.load(Zlib::Inflate.inflate(strings[9]))
  $floorenemies = Marshal.load(Zlib::Inflate.inflate(strings[10]))
  $fledam = Marshal.load(Zlib::Inflate.inflate(strings[11]))
#  $data_enemies = Marshal.load(Zlib::Inflate.inflate(strings[12]))
 
  # 魔法编号与保存时有差异的情况下
  # (加入编辑器的编辑过的数据)
  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
end

#==============================================================================
# ■ Scene_Load2
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================
class Scene_Load2 < Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize()#save_max = SAVE_MAX)
  # 再生成临时对像
  $game_temp = Game_Temp.new
  # 选择存档时间最新的文件
  $game_temp.last_file_index = 0
  latest_time = Time.at(0)
  for i in 0..7
    filename = make_filename(i)
    if FileTest.exist?(filename)
    begin
      file = Zlib::GzipReader.open(filename)
    rescue
      next
    end
    if file.mtime > latest_time
      latest_time = file.mtime
      $game_temp.last_file_index = i
    end
    file.close
    end
  end
  super("要载入哪个文件?")#,"读取",save_max)
end
#--------------------------------------------------------------------------
# ● 确定时的处理
#--------------------------------------------------------------------------
def on_decision(filename)
  # 文件不存在的情况下
  unless FileTest.exist?(filename)
    # 演奏冻结 SE
    $game_system.se_play($data_system.buzzer_se)
    return
  end
  # 演奏读档 SE
  $game_system.se_play($data_system.load_se)
  # 写入存档数据
  begin
    file = Zlib::GzipReader.open(filename)
    read_save_data(file)
  rescue
    # 演奏冻结 SE
    $game_system.se_play($data_system.buzzer_se)
    return
  end
  file.close
  # 还原 BGM、BGS
  $game_system.bgm_play($game_system.playing_bgm)
  $game_system.bgs_play($game_system.playing_bgs)
  # 刷新地图 (执行并行事件)
  $game_map.update
  # 切换到地图画面
  $scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# ● 取消时的处理
#--------------------------------------------------------------------------
def on_cancel
  # 演奏取消 SE
  $game_system.se_play($data_system.cancel_se)
  # 切换到标题画面
  $scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# ● 读取存档数据
#   file : 读取用文件对像 (已经打开)
#--------------------------------------------------------------------------
def read_save_data(file)
 
$desc=Marshal.load(file) 
  # 读取描绘存档文件用的角色数据
  characters = Marshal.load(file)
  # 读取测量游戏时间用画面计数
  Graphics.frame_count = Marshal.load(file)
  # 读取校验
  crcs = Marshal.load(file)
  # 读取文档字串
  strings = Marshal.load(file)
  # 校验检测
  key = SAVE_KEY
  strings.each_index do |i|
    key = Zlib.crc32(strings[i],key)
    unless crcs[i] == key
    file.close
    raise "file check error"
    return
    end
  end
  # 读取各种游戏对像
  $game_system = Marshal.load(Zlib::Inflate.inflate(strings[0]))
  $game_variables = Marshal.load(Zlib::Inflate.inflate(strings[1]))
  $game_self_switches = Marshal.load(Zlib::Inflate.inflate(strings[2]))
  $game_switches = Marshal.load(Zlib::Inflate.inflate(strings[3]))
  $game_troop = Marshal.load(Zlib::Inflate.inflate(strings[4]))
  $game_map = Marshal.load(Zlib::Inflate.inflate(strings[5]))
  $game_player = Marshal.load(Zlib::Inflate.inflate(strings[6]))
  $game_screen = Marshal.load(Zlib::Inflate.inflate(strings[7]))
  $game_actors = Marshal.load(Zlib::Inflate.inflate(strings[8]))
  $game_party = Marshal.load(Zlib::Inflate.inflate(strings[9]))
  $floorenemies = Marshal.load(Zlib::Inflate.inflate(strings[10]))
  $fledam = Marshal.load(Zlib::Inflate.inflate(strings[11]))
#  $data_enemies = Marshal.load(Zlib::Inflate.inflate(strings[12]))
 
  # 魔法编号与保存时有差异的情况下
  # (加入编辑器的编辑过的数据)
  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
end

#==============================================================================
# 自定义存档菜单
#==============================================================================
#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
#  处理存档画面的类。
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize()#save_max = SAVE_MAX)
  super("要保存到这个文件吗?")#,"存入",save_max)
end
#--------------------------------------------------------------------------
# ● 确定时的处理
#--------------------------------------------------------------------------
def on_decision(filename)
  # 演奏存档 SE
  $game_system.se_play($data_system.save_se)
  # 写入存档数据
  file = Zlib::GzipWriter.open(filename,9)
  write_save_data(file)
  file.close
  # 如果被事件调用
  if $game_temp.save_calling
    # 清除存档调用标志
    $game_temp.save_calling = false
    # 切换到地图画面
    $scene = Scene_Map.new
    return
  end
  # 切换到地图画面
  $scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# ● 取消时的处理
#--------------------------------------------------------------------------
def on_cancel
  # 演奏取消 SE
  $game_system.se_play($data_system.cancel_se)
  # 如果被事件调用
  if $game_temp.save_calling
    # 清除存档调用标志
    $game_temp.save_calling = false
    # 切换到地图画面
    $scene = Scene_Map.new
    return
  end
  # 切换到地图画面
  $scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# ● 写入存档数据
#   file : 写入用文件对像 (已经打开)
#--------------------------------------------------------------------------
def write_save_data(file) 
  # 生成描绘存档文件用的角色图形
  characters = []
  for i in 0...$game_party.actors.size
    actor = $game_party.actors[i]
    characters.push([actor.character_name, actor.character_hue,actor.id])
  end
 
  if $game_variables[6]==1
    if $game_switches[36]
      $desc="普通    第 "+$game_variables[2].to_s+" 层"
    else
      $desc="普通    "+$game_variables[2].to_s
    end
  else
    if $game_switches[36]
      $desc="困难    第 "+$game_variables[2].to_s+" 层"
    else
      $desc="困难    "+$game_variables[2].to_s
    end
  end
 
  strings = []
 
  Marshal.dump($desc,file)#自己加的用来显示难度和楼层的
 
  # 写入描绘存档文件用的角色数据
  Marshal.dump(characters,file)
  # 写入测量游戏时间用画面计数
  Marshal.dump(Graphics.frame_count,file)
  # 增加 1 次存档次数
  $game_system.save_count += 1
  # 保存魔法编号
  # (将编辑器保存的值以随机值替换)
  $game_system.magic_number = $data_system.magic_number
 
  # 写入各种游戏对像
  #$game_switches[4]=true#楼层第一次刷新的开关打开以便读档后刷新
#R工程的开关4通常都不是“当前楼层第一次刷新”#不能一存档就把开关4打开了,
#不然游戏会出错的
 
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_system)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_variables)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_self_switches)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_switches)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_troop)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_map)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_player)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_screen)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_actors)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($game_party)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($floorenemies)))
  strings.push(Zlib::Deflate.deflate(Marshal.dump($fledam)))
#  strings.push(Zlib::Deflate.deflate(Marshal.dump($data_enemies)))
 
 
  # 计算校验值
  crcs = []
  key = SAVE_KEY
  strings.each do |i|
    key = Zlib.crc32(i,key)
    crcs.push(key)
  end
  Marshal.dump(crcs,file)
  Marshal.dump(strings,file)
end
end
#==============================================================================
# ■ Window_SaveFile
#------------------------------------------------------------------------------
#  显示存档以及读档画面、保存文件的窗口。
#==============================================================================
class Window_SaveFile < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#   file_index : 存档文件的索引 (0~n)
#   filename   : 文件名
#--------------------------------------------------------------------------
def initialize(file_index, filename,viewport=nil)
  super(0, 64 + file_index % 4 * 104, 640, 104)
  self.contents = Bitmap.new(width - 32, height - 32)
  @file_index = file_index
  @filename = "Save/motaSave#{file_index + 1}.rxdata"
  @time_stamp = Time.at(0)
  @file_exist = FileTest.exist?(@filename)
  if @file_exist
    begin
    file = Zlib::GzipReader.open(filename)
    @time_stamp = file.mtime
   
    @desc=Marshal.load(file)
    @characters = Marshal.load(file)
    @frame_count = Marshal.load(file)
    @total_sec = @frame_count / Graphics.frame_rate
   
    file.close
    rescue
    @file_exist = false
    end
  end
 
  self.refresh
  @selected = false
end
end

一派護法 十九級
3樓 發表于:2013-7-7 16:44
然后,自己把脚本里面的密钥改了。当然你实在不想改也行。现在以前的存档因为密钥和文件结构等问题,已经不能读取了,下面详细讲解如何恢复以前的4个存档。先不要移动和改名这4个存档。(这个时候Scene_Title的读档部分也不要动,等存档恢复了再改)
一派護法 十九級
4樓 發表于:2013-7-7 16:45
把整个工程都复制一份,注意必须要复制一份。然后打开复制的那个工程。打开Scene_Title,把#--------------------------------------------------------------------------
  # ● 命令 : 继续
  #--------------------------------------------------------------------------下面的$scene = Scene_Load.new(大概在157行上下)改成$scene = RINIMA.new。然后再新建一个脚本,内容:
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  存档画面及读档画面的超级类。
#==============================================================================
class DASINI
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     help_text : 帮助窗口显示的字符串
  #--------------------------------------------------------------------------
  def initialize(help_text)
    @help_text = help_text
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成帮助窗口
    @help_window = Window_Help.new
    @help_window.set_text(@help_text)
    # 生成存档文件窗口
    @savefile_windows = []
    for i in 0..3
      @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
    end
    # 选择最后操作的文件
    @file_index = $game_temp.last_file_index
    @savefile_windows[@file_index].selected = true
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面被切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @help_window.update
    for i in @savefile_windows
      i.update
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 调用过程 on_decision (定义继承目标)
      on_decision(make_filename(@file_index))
      $game_temp.last_file_index = @file_index
      return
    end
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 调用过程 on_cancel (定义继承目标)
      on_cancel
      return
    end
    # 按下方向键下的情况下
    if Input.repeat?(Input::DOWN)
      # 方向键下的按下状态不是重复的情况下、
      # 并且光标的位置在 3 以前的情况下
      if Input.trigger?(Input::DOWN) or @file_index < 3
        # 演奏光标 SE
        $game_system.se_play($data_system.cursor_se)
        # 光标向下移动
        @savefile_windows[@file_index].selected = false
        @file_index = (@file_index + 1) % 4
        @savefile_windows[@file_index].selected = true
        return
      end
    end
    # 按下方向键上的情况下
    if Input.repeat?(Input::UP)
      # 方向键上的按下状态不是重复的情况下、
      # 并且光标的位置在 0 以后的情况下
      if Input.trigger?(Input::UP) or @file_index > 0
        # 演奏光标 SE
        $game_system.se_play($data_system.cursor_se)
        # 光标向上移动
        @savefile_windows[@file_index].selected = false
        @file_index = (@file_index + 3) % 4
        @savefile_windows[@file_index].selected = true
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成文件名
  #     file_index : 文件名的索引 (0~3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return "Save#{file_index + 1}.rxdata"
  end
end
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================
class RINIMA < DASINI
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    # 再生成临时对像
    $game_temp = Game_Temp.new
    # 选择存档时间最新的文件
    $game_temp.last_file_index = 0
    latest_time = Time.at(0)
    for i in 0..3
      filename = make_filename(i)
      if FileTest.exist?(filename)
        file = File.open(filename, "r")
        if file.mtime > latest_time
          latest_time = file.mtime
          $game_temp.last_file_index = i
        end
        file.close
      end
    end
    super("你妈逼")
  end
  #--------------------------------------------------------------------------
  # ● 确定时的处理
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # 文件不存在的情况下
    unless FileTest.exist?(filename)
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    # 演奏读档 SE
    $game_system.se_play($data_system.load_se)
    # 写入存档数据
    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)
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 切换到地图画面
    $scene = Scene_Map.new
  end
  #--------------------------------------------------------------------------
  # ● 取消时的处理
  #--------------------------------------------------------------------------
  def on_cancel
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换到标题画面
    $scene = Scene_Title.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
end

一派護法 十九級
5樓 發表于:2013-7-7 16:45
在复制的工程中建立save文件夹。
运行游戏,把4个存档中的每个存档都读档(读档画面写的是“你妈逼”,把1-4都读一遍,虽然看不到有文件显示),然后再存档。
这样save文件夹就有了4个新的存档。
把这4个存档拿出来,删掉复制的工程。再把这4个存档复制到原工程的save文件夹中。打开原工程,
标题画面的读档部分还要改。找到Scene_Title的47-52行,把
@continue_enabled = false
    for i in 0..3
      if FileTest.exist?("Save#{i+1}.rxdata")
        @continue_enabled = true
      end
    end
改成
@continue_enabled = false
    for i in 0..999
      if FileTest.exist?("Save/motaSave#{i+1}.rxdata")
        @continue_enabled = true
        break
      end
    end

然后运行游戏就行了。

一派護法 十九級
6樓 發表于:2013-7-7 16:46
————————本教程完毕

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:1153 回複數:5
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2013-7-7 16:46
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。