查看: 4727|回复: 3

[原创发布] 存档位真无限扩展 v2.1

[复制链接]

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2017-10-10 22:00:56 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 SailCat 于 2017-10-11 01:17 编辑

对本人2006年同名脚本的修订,去掉了所有设置项改成自适应,这次是真·无限了,100个,1000个随便你,只受磁盘空间的限制
实现原理:
本系统会自己检测所有从1开始连续编号的存档文件,并提供一个另存为空位,实现线性无限扩展。因此,第一次存档时,存档位只有1个而不是系统默认的4个,这是正常现象,它会随着你存档数目的增加而增加。
更新v2.1
1. 改善刷新方式,感谢@RyanBern
2. 新增翻页方式,最多一次可翻256,没有这么多存档时直接首尾而不是冻结
3. 优化显示效果,存档不足4个或不能被4整除时有空窗口占位,不会有黑边
4. 增加了对于Scene_Load检索的支持

其他见脚本说明:
[pre lang="ruby"]#==============================================================================
# ■ 存档位真·无限扩展 v2.1 by SailCat
#------------------------------------------------------------------------------
#   方法:插入到Main之前使用。
#   版本:v2.1 (Build 171011)
#   效果:存档位真·无限扩展,不需要配置,系统自动检测根据存档逐一扩展
#   冲突:和其他存档扩展脚本冲突
#   操作:上下翻1,左右翻4,Ctrl+上下翻16,Ctrl+左右翻64,LR翻256,Ctrl+LR头尾
#==============================================================================

class Scene_File
  #--------------------------------------------------------------------------
  # ● 追加定义
  #--------------------------------------------------------------------------
  attr_reader  :top_index # 首项 索引值
  unless method_defined? :sailcat_initialize
    alias sailcat_initialize initialize
  end
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     help_text : 帮助窗口显示的字符串
  #--------------------------------------------------------------------------
  def initialize(help_text)
    sailcat_initialize(help_text)
    @file_count ||= save_count
  end
  #--------------------------------------------------------------------------
  # ● 设置首项,重绘首项之后的4个窗口
  #     index : 新的首项
  #--------------------------------------------------------------------------
  def top_index=(index)
    index = [0, [index / 4 * 4, @file_count - 1].min].max
    if @top_index != index
      @top_index = index
      redraw_windows
    end
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成帮助窗口
    @help_window = Window_Help.new
    @help_window.set_text(@help_text)
    # 选择最后操作的文件
    @file_index = [@file_count - 1, $game_temp.last_file_index].min
    # 只刷新需要显示的窗口
    self.top_index = @file_index
    @savefile_windows[@file_index % 4].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[0..3]
      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)
      move_index(Input.press?(Input::CTRL) ? 16 : 1)
      return
    end
    # 按下上方向键的情况下
    if Input.repeat?(Input::UP)
      move_index(Input.press?(Input::CTRL) ? -16 : -1)
      return
    end
    # 按下左方向键的情况下
    if Input.repeat?(Input::LEFT)
      move_index(Input.press?(Input::CTRL) ? -64 : -4)
      return
    end
    # 按下右方向键的情况下
    if Input.repeat?(Input::RIGHT)
      move_index(Input.press?(Input::CTRL) ? 64 : 4)
      return
    end
    # 按下 R 键的情况下
    if Input.trigger?(Input::R)
      Input.press?(Input::CTRL) ? set_index(-1) : move_index(256)
      return
    end
    # 按下 L 键的情况下
    if Input.trigger?(Input::L)
      Input.press?(Input::CTRL) ? set_index(0) : move_index(-256)
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成文件名
  #     file_index : 文件名的索引 (0~3)
  #--------------------------------------------------------------------------
  def make_filename(file_index)
    return "Save#{file_index + 1}.rxdata"
  end
  #--------------------------------------------------------------------------
  # ● 移动光标
  #     distance : 移动的距离
  #--------------------------------------------------------------------------
  def move_index(distance)
    if @file_index == 0 and distance < 0
      set_index(-1)
    elsif @file_index == @file_count - 1 and distance > 0
      set_index(0)
    else
      set_index([0, [@file_index + distance, @file_count - 1].min].max)
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置光标位置
  #     new_index : 新光标位置
  #--------------------------------------------------------------------------
  def set_index(new_index)
    new_index += @file_count if new_index < 0
    # 演奏光标 SE
    $game_system.se_play($data_system.cursor_se)
    # 光标移动到新位置
    @savefile_windows[@file_index % 4].selected = false
    @file_index = new_index
    self.top_index = new_index
    @savefile_windows[@file_index % 4].selected = true
  end
  #--------------------------------------------------------------------------
  # ● 检测存档数目
  #--------------------------------------------------------------------------
  def save_count
    i = 0
    while FileTest.exists?(make_filename(i))
      i += 1
    end
    return self.is_a?(Scene_Save) ? i + 1 : i
  end
  #--------------------------------------------------------------------------
  # ● 重绘存档文件窗口
  #--------------------------------------------------------------------------
  def redraw_windows
    # 生成存档文件窗口
    @savefile_windows.each { |i| i.dispose } unless @savefile_windows == nil
    @savefile_windows = []
    for i in @top_index...[@top_index + 4, @file_count].min
      filename = make_filename(i)
      window = Window_SaveFile.new(i, filename)
      window.y = i % 4 * 104 + 64
      @savefile_windows.push(window)
    end
    (4 - @savefile_windows.size).times do |i|
      window = Window_Base.new(0, 376 - i * 104, 640, 104)
      window.opacity = window.back_opacity = 128
      @savefile_windows.push(window)
    end
  end
end

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    # 再生成临时对像
    $game_temp = Game_Temp.new
    # 选择存档时间最新的文件
    $game_temp.last_file_index = 0
    latest_time = Time.at(0)
    @file_count = save_count
    for i in 0...@file_count
      File.open(make_filename(i), "r") do |f|
        if f.mtime > latest_time
          latest_time = f.mtime
          $game_temp.last_file_index = i
        end
      end
    end
    super("要载入哪个文件?")
  end
end
[/pre]


范例工程点此下载:
SceneFileEx.zip (203.57 KB, 下载次数: 63, 售价: 8 星屑)






评分

参与人数 6星屑 +100 赞 +6 收起 理由
mo_min + 1 精品文章
blueppe + 1 精品文章
yyyyes + 1 精品文章
89444640 + 1 塞糖
龙夫三拳tan + 1 精品文章
RyanBern + 100 + 1 精品文章

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2017-10-11 00:14:45 | 显示全部楼层
本帖最后由 RyanBern 于 2017-10-11 00:17 编辑

一个小小的建议:Window_SaveFile 类的窗口最多只需要四个。(当然默认的 Window_SaveFile 里面的内容给写死了真心差评)

点评

已改,刷新效率没有明显下降,加载快很多。  发表于 2017-10-11 01:11
那翻页就得做refresh而不是update了,我改一下,之前是怕卡帧,用空间换时间(因为仅update相关的4个)……实际测试下效果看看  发表于 2017-10-11 00:18
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部