irpg Community
เซฟหลายช่อง (Multiple Save Slots) - Printable Version

+- irpg Community (https://irpg.in.th)
+-- Forum: irpg Fabella RPG Maker Academia (https://irpg.in.th/forum-4.html)
+--- Forum: RGSS and JS Showcase (https://irpg.in.th/forum-26.html)
+--- Thread: เซฟหลายช่อง (Multiple Save Slots) (/thread-3049.html)



เซฟหลายช่อง (Multiple Save Slots) - jojo741963 - 02-25-2017

เซฟหลายช่อง (Multiple Save Slots)

[Image: untitled03.gif]

กับเกมบางเกมที่มีฉากจบหลายๆ รูท บวกกับผู้สร้างมีความเป็นมิตรกับผู้เล่น (Player-friendly) ดังนั้น การมีช่องเซฟเยอะ จึงเป็นทางเลือกที่ดีสำหรับปัญหานี้ หากต้องการให้คนเล่นสามารถมีการตัดสินใจที่หลากหลาย และสะดวกในการเล่นระดับนึง แต่ว่ายิ่งช่องเซฟเยอะ เวลาเข้าหน้าจอเซฟกับโหลดจะใช้เวลานานนะ ถ้าเกินกว่า 500 นี่อาจจะถึงขั้นทำงานจนระเบิดปิดเกมตัวเองไปได้เลย (จริงๆ 500 ก็คงไม่มีใครเซฟถึงหรอกนะ)

** เนื่องจากเป็นการใช้วิธีเรียกวินโดว์ช่องเซฟออกมาตามจำนวนเซฟที่ระบุ ดังนั้นสคริปต์จะเรียกออกมาพร้อมกันในคราวเดียวหมดเลย ทำหน้าเหยาหมิง
เวลาจะอัพเดตวินโดว์แต่ละรอบจึงต้องปรับตำแหน่งวินโดว์ทั้งหมดใหม่ด้วย

ผู้เขียน : jojo741963
เวอร์ชั่น : 1.0 - 29/11/16

รายละเอียด :
- เซฟมากกว่า 4 ช่องได้

วิธีการใช้งาน : วางสคริปต์นี้เหนือสคริปต์ Main และใต้สคริปต์ Scene_Debug

แล้วเซ็ตจำนวนช่องเซฟที่ต้องการได้ที่
Code:
SLOTS = 8
จะดีมากหากท่านกำหนดให้เลขอย่างน้อย 4 ขึ้นไป เพราะทางผู้เขียนสคริปต์ยังไม่ได้ทดสอบสำหรับกรณีน้อยกว่า 4 นั่นเอง Mother of God
(เอาจริงๆ จากที่ทดสอบแบบผ่านๆ ก็น่าจะไม่มีปัญหานะ)

ความเข้ากันได้ : อาจจะเกิดปัญหาได้กับสคิรปต์ที่มีการเขียนทับ Scene_Title, Window_SaveFile และ Scene_File ได้
เพราะใช้วิธีการเขียนทับในการเขียนสคริปต์นี้ (overwrite script) แต่ก็อาจจะสามารถใช้ร่วมกันได้ หากผู้ใช้คัดลอกไปเฉพาะโค้ดเพิ่มเติมที่ผู้สร้างระบุไว้
โค้ดในส่วนที่เพิ่มไปจะมี #ADD เขียนกำกับไว้อยู่

ข้อตกลงการนำไปใช้ : ปรับแต่งได้ถ้าคุณต้องการ เอาไปใช้หรือแจกที่ไหนก็รบกวนให้เครดิตด้วยนะงับ

สคริปต์ : http://pastebin.com/raw/Dv8bucY3
หรือ
Code:
#==============================================================================
# **  เซฟหลายช่อง (Multiple_Save_Slots)
#------------------------------------------------------------------------------
# * โดย: jojo741963
# * เวอร์ชั่น: 1.0
#    29-11-2016
#------------------------------------------------------------------------------
#  รายละเอียดของสคริปต์นี้  :
#   -  เซฟมากกว่า 4 ช่องได้
#------------------------------------------------------------------------------
#  วิธีการใช้งานสคริปต์นี้ :
#     วางสคริปต์นี้เหนือสคริปต์ Main และใต้สคริปต์ Scene_Debug
#     แล้วเซ็ตค่าได้ด่านล่างเลยครับ
#------------------------------------------------------------------------------
#  ความเข้ากันได้ :
#     อาจจะเกิดปัญหาได้กับสคิรปต์ที่มีการเขียนทับ Scene_Title, Window_SaveFile และ
#     Scene_File ได้ เพราะใช้วิธีการเขียนทับในการเขียนสคริปต์นี้
#     แต่ก็อาจจะสามารถใช้ร่วมกันได้ หากผู้ใช้คัดลอกไปเฉพาะโค้ดเพิ่มเติมที่ผู้สร้างระบุไว้
#    โค้ดในส่วนที่เพิ่มไปจะมี #ADD เขียนกำกับไว้อยู่
#==============================================================================

module MSS#Multiple_Save_Slots
  
  #ช่องเซฟที่ต้องการ (ต้องไม่น้อยกว่า 4)
  SLOTS = 8
  
end

class Scene_Title
  #--------------------------------------------------------------------------
  # - Main processing
  #--------------------------------------------------------------------------
  def main
    # In case of aggressive test
    if $BTEST
      battle_test
      return
    end
    # Loading the database
    $data_actors        = load_data("Data/Actors.rxdata")
    $data_classes       = load_data("Data/Classes.rxdata")
    $data_skills        = load_data("Data/Skills.rxdata")
    $data_items         = load_data("Data/Items.rxdata")
    $data_weapons       = load_data("Data/Weapons.rxdata")
    $data_armors        = load_data("Data/Armors.rxdata")
    $data_enemies       = load_data("Data/Enemies.rxdata")
    $data_troops        = load_data("Data/Troops.rxdata")
    $data_states        = load_data("Data/States.rxdata")
    $data_animations    = load_data("Data/Animations.rxdata")
    $data_tilesets      = load_data("Data/Tilesets.rxdata")
    $data_common_events = load_data("Data/CommonEvents.rxdata")
    $data_system        = load_data("Data/System.rxdata")
    # Drawing up system object
    $game_system = Game_System.new
    # Drawing up title graphics
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    # Drawing up the command window
    s1 = "New Game"
    s2 = "Continue"
    s3 = "Shutdown"
    @command_window = Window_Command.new(192, [s1, s2, s3])
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 288
    # Continuing effective decision
    # You inspect whether or not the saving file exists even at one
    # If validity if @continue_enabled true, invalidity it makes false
    @continue_enabled = false
    for i in 0..MSS::SLOTS-1 #ADD
      if FileTest.exist?("Save#{i+1}.rxdata")
        @continue_enabled = true
      end
    end
    # When continuing is effective, cursor is adjusted to continuing
    # In invalid case, letter of continuing is made grey indication
    if @continue_enabled
      @command_window.index = 1
    else
      @command_window.disable_item(1)
    end
    # Performing title BGM
    $game_system.bgm_play($data_system.title_bgm)
    # Stopping the performance of ME and BGS
    Audio.me_stop
    Audio.bgs_stop
    # Transition execution
    Graphics.transition
    # Main loop
    loop do
      # Renewing the game picture
      Graphics.update
      # Updating the information of input
      Input.update
      # Frame renewal
      update
      # When the picture changes, discontinuing the loop
      if $scene != self
        break
      end
    end
    # Transition preparation
    Graphics.freeze
    # Releasing the command window
    @command_window.dispose
    # Releasing title graphics
    @sprite.bitmap.dispose
    @sprite.dispose
  end
end

#==============================================================================
# * Window_SaveFile
#------------------------------------------------------------------------------
#  It indicates in the saving picture and the load picture, it is the window of the saving file.
#==============================================================================

class Window_SaveFile < Window_Base
  #--------------------------------------------------------------------------
  # - Open instance variable
  #--------------------------------------------------------------------------
  attr_reader   :filename                 # File name
  attr_reader   :selected                 # Selective state
  #--------------------------------------------------------------------------
  # - Object initialization
  #     file_index : Index of saving file (0 - 3)
  #     filename   : File name
  #--------------------------------------------------------------------------
  def initialize(file_index, filename)
    super(0, 64 + file_index % MSS::SLOTS * 104, 640, 104) #ADD
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $fontface
    self.contents.font.size = $fontsize
    @file_index = file_index
    @filename = "Save#{@file_index + 1}.rxdata"
    @time_stamp = Time.at(0)
    @file_exist = FileTest.exist?(@filename)
    if @file_exist
      file = File.open(@filename, "r")
      @time_stamp = file.mtime
      @characters = Marshal.load(file)
      @frame_count = Marshal.load(file)
      @game_system = Marshal.load(file)
      @game_switches = Marshal.load(file)
      @game_variables = Marshal.load(file)
      @total_sec = @frame_count / Graphics.frame_rate
      file.close
    end
    refresh
    @selected = false
  end
  
end


#==============================================================================
# * Scene_File
#------------------------------------------------------------------------------
#  It is superclass of the saving picture and the load picture.
#==============================================================================

class Scene_File
  def main
    # Drawing up the help window
    @help_window = Window_Help.new
    @help_window.set_text(@help_text)
    # Drawing up the saving file window
    @savefile_windows = []
    for i in 0..MSS::SLOTS-1
      @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
    end
    # Selecting the file which was operated lastly
    
    #ADD
    @top_index = 0
    @bottom_index = 3
    
    @file_index = $game_temp.last_file_index
    @savefile_windows[@file_index].selected = true
    
    #ADD
    set_window_from_start if @file_index > 0
    
    # Transition execution
    Graphics.transition
    # Main loop
    loop do
      # Renewing the game picture
      Graphics.update
      # Updating the information of input
      Input.update
      # Frame renewal
      update
      # When the picture changes, discontinuing the loop
      if $scene != self
        break
      end
    end
    # Transition preparation
    Graphics.freeze
    # Releasing the window
    @help_window.dispose
    for i in @savefile_windows
      i.dispose
    end
  end
  #--------------------------------------------------------------------------
  # - Frame renewal
  #--------------------------------------------------------------------------
  def update
    # Renewing the window
    @help_window.update
    for i in @savefile_windows
      i.update
    end
    # When C button is pushed
    if Input.trigger?(Input::C)
      # Method on_decision (definition ahead succeeding) it calls
      on_decision(make_filename(@file_index))
      $game_temp.last_file_index = @file_index
      return
    end
    # The B when button is pushed
    if Input.trigger?(Input::B)
      # od on_cancel (definition ahead succeeding) it calls
      on_cancel
      return
    end
    # When the bottom of the direction button is pushed
    if Input.repeat?(Input::DOWN)
      # Depression state under the direction button is not repeat when
      # Or when cursor position it is before from 3
      if Input.trigger?(Input::DOWN) or @file_index < MSS::SLOTS-1        
        # Performing cursor SE
        $game_system.se_play($data_system.cursor_se)
        # Moving cursor under
        @savefile_windows[@file_index].selected = false
        @file_index = (@file_index + 1) % MSS::SLOTS
        @savefile_windows[@file_index].selected = true
        
        #ADD
        check_move_window
        
        return
      end
    end
    # When the top of the direction button is pushed
    if Input.repeat?(Input::UP)
      # Depression state on the direction button is not repeat when
      # Or when cursor position it is rear from 0
      if Input.trigger?(Input::UP) or @file_index > 0
        # Performing cursor SE
        $game_system.se_play($data_system.cursor_se)
        # Moving cursor on
        @savefile_windows[@file_index].selected = false
        @file_index = (@file_index + MSS::SLOTS-1) % MSS::SLOTS
        @savefile_windows[@file_index].selected = true
        
        #ADD
        check_move_window
        
        return
      end
    end
  end
  
  #ADD
  def check_move_window
    if @file_index > @bottom_index
      @bottom_index = @file_index
      @top_index = @bottom_index - 3
      move_window_up
    end
    if @file_index < @top_index
      @top_index = @file_index
      @bottom_index = @top_index + 3
      move_window_down
    end
    if @file_index == 0
      @top_index = 0
      @bottom_index = 3  
      set_window
    end
    if @file_index == MSS::SLOTS-1
      @bottom_index = MSS::SLOTS-1
      @top_index = @bottom_index - 3
      set_window_from_bottom
    end
    check_visible
  end

  def check_visible
    for i in 0..MSS::SLOTS-1
      if i.between?(@top_index, @bottom_index)
        @savefile_windows[i].visible = true
      else
        @savefile_windows[i].visible = false
      end
    end
  end
  
  def move_window_up
    for i in @savefile_windows
      i.y -= 104
    end
  end
    
  def move_window_down
    for i in @savefile_windows
      i.y += 104
    end
  end
    
  def set_window
    for i in @savefile_windows
      i.dispose
    end
    @savefile_windows = []
    for i in 0..MSS::SLOTS-1
      @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
    end
    @savefile_windows[@file_index].selected = true
  end
    
  def set_window_from_bottom
    set_window
    for i in 1..@top_index
      move_window_up
    end      
  end
    
  def set_window_from_start
    if @file_index >= MSS::SLOTS-4
      @top_index = MSS::SLOTS-4
      @bottom_index = MSS::SLOTS-1
      set_window_from_bottom
    else
      @top_index = @file_index
      @bottom_index = @top_index + 3
      for i in 1..@top_index
        move_window_up
      end
    end
    check_visible
  end
    
end

Derp ขอให้มีความสุขกับการเซฟนะครับ


RE: เซฟหลายช่อง (Multiple Save Slots) - XthemeCore - 02-26-2017

ขอบคุณคนับ แต่ว่า.... ไม่ได้แตะ RMXP นานมากแล้วแฮะ ตายแปป