Welcome Guest: S’enregistrer | Connexion
 
Portail  | FAQ | Rechercher | Membres | Groupes
 
Système de sauvegarde Ratchet & Clank
 
Poster un nouveau sujet   Répondre au sujet
RPG Community Index du Forum -> RPG Maker -> Scripts RPG Maker XP
Sujet précédent :: Sujet suivant  
Auteur Message
DrakeRoxas
Dieu
Dieu

Hors ligne

Inscrit le: 06 Mar 2009
Messages: 37
Points RPG Community: 0
Moyenne de points: 0,00

MessagePosté le: 17/10/2010 22:22:15
MessageSujet du message: Système de sauvegarde Ratchet & Clank
Répondre en citant

Mettez ce script :

 
Code:

#==============================================================================
# ■ Window_SaveFile
#------------------------------------------------------------------------------
#  セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。
#==============================================================================

class Window_SaveFile < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :filename                 # ファイル名
  attr_reader   :selected                 # 選択状態
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     file_index : セーブファイルのインデックス (0~3)
  #     filename   : ファイル名
  #--------------------------------------------------------------------------
  def initialize(type)
    super(0, 64, 640, 416)
    self.index = 0
    @type = type
    file_index = 0
    @filename = []
    if $scene.is_a?(Scene_Save)
      @filename.push("Créer une nouvelle sauvegarde")
      if @type != -1
        self.index += 1
      end
    end
    loop do
      if FileTest.exist?("Sauvegarde #{file_index + 1}.rxdata")
        file_index += 1
      else
        break
      end
    end
    loop do
      if file_index > 0
        @filename.push("Sauvegarde #{file_index}.rxdata")
        file_index -= 1
      else
        break
      end
    end
    if @type == -1
      @filename.push("Continuer sans sauvegarder")
    end
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.clear
    end
    if @filename.size * 72 >= 384
      size = @filename.size * 72
    else
      size = 384
    end
    self.contents = Bitmap.new(width - 32, size)
    self.contents.font.name = $fontface
    self.contents.font.size = $fontsize
    for y in 0...@filename.size
      if @filename[y] == "Créer une nouvelle sauvegarde" or @filename[y] == "Continuer sans sauvegarder"
        name = @filename[y]
        self.contents.draw_text(4, y * 72, 600, 32, name)
      else
        file = File.open(@filename[y], "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
        for i in 0...3
          Marshal.load(file)
        end
        party = Marshal.load(file)
        file.close
        self.contents.font.color = normal_color
        if @type != -1
          name = "Sauvegarde #{@filename.size - y}"
        else
          name = "Sauvegarde #{@filename.size - y - 1}"
        end
        self.contents.draw_text(4, y * 72, 600, 32, name)
        draw_actor_name(party.actors[0], 4, y * 72 + 34)
        # キャラクターを描画
        for i in 0...@characters.size
          actor = party.actors[i]
          bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
          cw = bitmap.rect.width / 4
          ch = bitmap.rect.height / 4
          src_rect = Rect.new(0, 0, cw, ch)
          x = 300 - @characters.size * 32 + i * 64 - cw / 2
          self.contents.blt(x, 68 - ch + 72 * y, bitmap, src_rect)
          draw_actor_level(actor, x - 15, 72 * y + 47)
        end
        # プレイ時間を描画
        hour = @total_sec / 60 / 60
        min = @total_sec / 60 % 60
        sec = @total_sec % 60
        time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
        self.contents.font.color = normal_color
        self.contents.draw_text(4, 8 + 72 * y, 600, 32, time_string, 2)
        # タイムスタンプを描画
        self.contents.font.color = normal_color
        time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
        self.contents.draw_text(4, 40 + 72 * y, 600, 32, time_string, 2)
      end
      self.contents.fill_rect(0,72 * y - 1, 608, 2, Color.new(255, 255, 255)) 
    end
    self.contents.fill_rect(0,72 * @filename.size - 1, 608, 2, Color.new(255, 255, 255)) 
  end
  #--------------------------------------------------------------------------
  # ● 選択状態の設定
  #     selected : 新しい選択状態 (true=選択 false=非選択)
  #--------------------------------------------------------------------------
  def selected
    if $scene.is_a?(Scene_Load)
      index = self.index + 1
    else
      index = self.index
    end
    case index
    when 0
      return true
    when (@filename.size - 1)
      if @type == -1
        return false
      else
        return @filename[self.index]
      end
    else
      return @filename[self.index]
    end
  end
  #--------------------------------------------------------------------------
  # ● 選択状態の設定
  #     selected : 新しい選択状態 (true=選択 false=非選択)
  #--------------------------------------------------------------------------
  def max
    return (@filename.size - 1)
  end
  #--------------------------------------------------------------------------
  # ● カーソルの矩形更新
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # カーソル位置が 0 未満の場合
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 現在の行を取得
    row = @index
    if @top_row == nil
      @top_row = 0
    end
    # 現在の行が、表示されている先頭の行より前の場合
    if row < @top_row
      # 現在の行が先頭になるようにスクロール
      self.oy -= 360
      @top_row -= 5
    end
    # 現在の行が、表示されている最後尾の行より後ろの場合
    if row > @top_row + 4
      # 現在の行が最後尾になるようにスクロール
      self.oy += 360
      @top_row += 5
    end
    # カーソルの矩形を更新
    self.cursor_rect.set(0, 72 * self.index - self.oy, 608, 72)
  end
end


#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  セーブ画面およびロード画面のスーパークラスです。
#==============================================================================

class Scene_File
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     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 = Window_SaveFile.new(@type)
    @index = @savefile_windows.index
    # 最後に操作したファイルを選択
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @help_window.dispose
    @savefile_windows.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新
    @help_window.update
    @savefile_windows.update
    if @savefile_windows.index != @index
      @savefile_windows.index = @index
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # メソッド on_decision (継承先で定義) を呼ぶ
      on_decision(@savefile_windows.selected)
      return
    end
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # メソッド on_cancel (継承先で定義) を呼ぶ
      on_cancel
      return
    end
    # 方向ボタンの下が押された場合
    if Input.repeat?(Input::DOWN)
      # 方向ボタンの下の押下状態がリピートでない場合か、
      if Input.trigger?(Input::DOWN)
        if @index < @savefile_windows.max
          # カーソル SE を演奏
          $game_system.se_play($data_system.cursor_se)
          # カーソルを下に移動
          @index += 1
          return
        else
          $game_system.se_play($data_system.buzzer_se)
        end
      end
    end
    # 方向ボタンの上が押された場合
    if Input.repeat?(Input::UP)
      # 方向ボタンの上の押下状態がリピートでない場合か、
      # またはカーソル位置が 0 より後ろの場合
      if Input.trigger?(Input::UP)
        if @index > 0
          # カーソル SE を演奏
          $game_system.se_play($data_system.cursor_se)
          # カーソルを下に移動
          @index -= 1
          return
        else
          $game_system.se_play($data_system.buzzer_se)
        end
      end
    end
    # 方向ボタンの下が押された場合
    if Input.repeat?(Input::LEFT)
      # 方向ボタンの下の押下状態がリピートでない場合か、
      if Input.trigger?(InputLEFT)
        if @index < @savefile_windows.max
          # カーソル SE を演奏
          $game_system.se_play($data_system.cursor_se)
          # カーソルを下に移動
          @index = @savefile_windows.max
          return
        else
          $game_system.se_play($data_system.buzzer_se)
        end
      end
    end
    # 方向ボタンの下が押された場合
    if Input.repeat?(Input::RIGHT)
      # 方向ボタンの下の押下状態がリピートでない場合か、
      if Input.trigger?(Input::RIGHT)
        if @index > 0
          # カーソル SE を演奏
          $game_system.se_play($data_system.cursor_se)
          # カーソルを下に移動
          @index = 0
          return
        else
          $game_system.se_play($data_system.buzzer_se)
        end
      end
    end
  end
end

#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
#  セーブ画面の処理を行うクラスです。
#==============================================================================

class Scene_Save < Scene_File
  #--------------------------------------------------------------------------
  # ● 決定時の処理
  #--------------------------------------------------------------------------
  def initialize(type = 0)
    super("Voulez vous sauvegarder la partie ?")
    @type = type
  end
  #--------------------------------------------------------------------------
  # ● 決定時の処理
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # セーブ SE を演奏
    $game_system.se_play($data_system.save_se)
    # セーブデータの書き込み
    if filename == true
      file_index = 1
      loop do
        if FileTest.exist?("Sauvegarde #{file_index}.rxdata")
          file_index += 1
        else
          break
        end
      end
      filename = "Sauvegarde #{file_index}.rxdata"
      $auto_save = filename
      write_save_data(filename)
    elsif filename != true and filename != false
      $auto_save = filename
      write_save_data(filename)
    elsif filename == false
      $auto_save = nil
    end
    # イベントから呼び出されている場合
    if $game_temp.save_calling
      # セーブ呼び出しフラグをクリア
      $game_temp.save_calling = false
      # マップ画面に切り替え
      $scene = Scene_Map.new
      return
    end
    # メニュー画面に切り替え
    if @type == -1
      $scene = Scene_Map.new
    else
      $scene = Scene_Menu.new(4)
    end
  end
  #--------------------------------------------------------------------------
  # ● セーブデータの書き込み
  #     file : 書き込み用ファイルオブジェクト (オープン済み)
  #--------------------------------------------------------------------------
  def write_save_data(filename)
    # セーブファイル描画用のキャラクターデータを作成
    file = File.open(filename, "wb")
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      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)
    Marshal.dump($map_saving_auto, file)
    $map_charged = []
    for i in 0...$map_saving_auto.size
      map = $map_saving_auto[i]
      $map_charged.push(map[1])
      $map_charged.push(map[2])
      if $game_map.map_id == map[0]
        $map_charged.push(map[0])
      else
        for j in 0...map[3].size
          if $game_map.map_id == map[3][j]
            $game_map.map_id = map[0]
            $map_charged.push(map[0])
            $game_map.map_id = map[3][j]
          end
        end
      end
    end
    Marshal.dump($map_charged, file)
    file.close
  end
end

#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  ロード画面の処理を行うクラスです。
#==============================================================================

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  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("Charger quelle partie?")
  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)
    $map_saving_auto = Marshal.load(file)
    $map_charged = 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_map.setup($map_charged[3])
    $game_player.moveto($map_charged[0], $map_charged[1])
    $map_charged = []
    # パーティメンバーをリフレッシュ
    $game_party.refresh
  end
end

#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  タイトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # ● コマンド : ニューゲーム
  #--------------------------------------------------------------------------
  def command_new_game
    # 決定 SE を演奏
    $game_system.se_play($data_system.decision_se)
    # BGM を停止
    Audio.bgm_stop
    # プレイ時間計測用のフレームカウントをリセット
    Graphics.frame_count = 0
    # 各種ゲームオブジェクトを作成
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    # 初期パーティをセットアップ
    $game_party.setup_starting_members
    # 初期位置のマップをセットアップ
    $game_map.setup($data_system.start_map_id)
    # プレイヤーを初期位置に移動
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    # プレイヤーをリフレッシュ
    $game_player.refresh
    # マップに設定されている BGM と BGS の自動切り替えを実行
    $game_map.autoplay
    # マップを更新 (並列イベント実行)
    $game_map.update
    # マップ画面に切り替え
    $scene = Scene_Save.new(-1)
  end
end



Puis allez dans le script Scene_Title et remplacer (ligne 48) :

 
Code:

    for i in 0..3
      if FileTest.exist?("Save#{i+1}.rxdata")
        @continue_enabled = true
      end
    end



par :

 
Code:

    #for i in 0..3
    #  if FileTest.exist?("Save#{i+1}.rxdata")
    #    @continue_enabled = true
    #  end
    #end
    if FileTest.exist?("Sauvegarde 1.rxdata")
      @continue_enabled = true
    end



Enfin retournez à la ligne 18 et ajoutez :"$map_saving_auto = []" au dessus de "$data_actors        = load_data("Data/Actors.rxdata")"



Voilà, le script est presque fonctionel. Il ne vous reste plus qu'as définir à quelle carte et quelle position recommenceras le héros après un chargement de la partie.

Pour ce faire, rajoutez entre les crochez du "$map_saving_auto = []" :
[map_de_depart, position_x, position_y, [MQNESLMD_1, MQNESLMD_2, MQNESLMD_3, MQNESLMD_4], [map_de_depart2, position_x2, position_y2, [MQNESLMD2_1, MQNESLMD2_2, MQNESLMD2_3, MQNESLMD2_4]
MQNESLMD = Map_Qui_Nous_Envois_Sur_La_Map_de_Départ
(le tout entre les 2 crochets)

En exemple : si vous mettez [[1, 5, 10, [2, 3, 4, 5, 6, 7]], [8, 3, 4, [9]], [10, 1, 1, []]]
Si vous sauvegarder :
          - Sur les map 1, 2, 3, 4, 5, 6 ou 7, vous reprendrez sur la map n°1, à la position 5,10
          - Sur les map 8 et 9, vous reprendrez sur la map n°8, à la position 3,4
          - Sur la map 10, vous reprendrez sur la map n°10, à la position 1,1

J'espère que vous avez compris ^^'


Sinon, voilà un aperçu ... :
Revenir en haut
Publicité






MessagePosté le: 17/10/2010 22:22:15
MessageSujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Montrer les messages depuis:   
RPG Community Index du Forum -> RPG Maker -> Scripts RPG Maker XP Toutes les heures sont au format GMT + 2 Heures
Poster un nouveau sujet   Répondre au sujet
Page 1 sur 1
Sauter vers:  

 

Portail | Index | Panneau d’administration | Créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
phpBB
Template by BMan1
Traduction par : phpBB-fr.com