FC2ブログ

RGSS1備忘録その2 アイテムウインドウのソート

今日は、アイテムウインドウのソートについてやります。
通常ですとアイテムウインドウには、アイテムと一緒に武器や防具なども一緒に
表示されてしまいます。これだと、持ち物がどんどん増えてくると、探すのに時間がかかり
「あのアイテムねぇぞ、どこいったゴルァ!ヽ(`Д´)ノ」てなことになったりします(´・ω・`)
そこで、アイテム、武器、防具をそれぞれ分類してアイテムウインドウに表示させる
っていうのをやりたいと思います。

まず、スクリプトのScene_Itemの改造から

 


 

class Scene_Item
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★
  attr_reader:sort_window_index     #ソートウインドウのインデックス
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★

  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    #ソートウインドウの作成
    s1 = "アイテム"
    s2 = "武器"
    s3 = "防具"
    @sort_window = Window_Command.new(160, [s1, s2, s3])
    @sort_window.z = 200
    @sort_window_index = 0
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # ヘルプウィンドウ、アイテムウィンドウを作成
    @help_window = Window_Help.new
    @item_window = Window_Item.new
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @item_window.active = false    #アイテムウインドウを非アクティブ化
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # ヘルプウィンドウを関連付け
    @item_window.help_window = @help_window
    # ターゲットウィンドウを作成 (不可視・非アクティブに設定)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false

    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @help_window.dispose
    @item_window.dispose
    @target_window.dispose
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @sort_window.dispose
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新
    @help_window.update
    @item_window.update
    @target_window.update
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    @sort_window.update            #sort_windowのアップデート
    #sort_windowがアクティブの場合update_sortを呼ぶ
    if @sort_window.active
      update_sort
      return
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★   
    # アイテムウィンドウがアクティブの場合: update_item を呼ぶ
    if @item_window.active
      update_item
      return
    end
    # ターゲットウィンドウがアクティブの場合: update_target を呼ぶ
    if @target_window.active
      update_target
      return
    end
  end
 
 
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ソートウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_sort
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー画面に切り替え
      $scene = Scene_Menu.new(0)
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      @item_window.active = true
      @sort_window.active = false
      @sort_window.visible = false
      @item_window.refresh
    end
    if Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
      @sort_window_index = @sort_window.index
      @item_window.refresh
    end
  end
  #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 
end





付け足す部分は、赤くしました。イェーィ
まず、ソートウインドウは、このように表示させます。
071216_02.jpg

ではスクリプトの解説に移ります。
attr_reader:sort_window_indexは、ソートウインドウのインデックスをあとから、
Window_Itemクラスの@item_windowが参照するために設定します。
今回はインデックス0がアイテム、1が武器、2が防具となっています。
アイテムウインドウは@item_window.active = falseで、非アクティブ化にしておきます。
これをしないと、ソートウインドウと、アイテムウインドウが連動して動いてしまいます。
また、@sort_window.disposeで、シーンが変わったときにソートウインドウを解放させます。
これを忘れると、いつまでたってもソートウインドウが表示されたままになってしまいます。

次に、フレームの更新です。
まず、@sort_window.updateでウインドウの動きを視覚化します。
そのあとの文は、ソートウインドウがアクティブであれば、update_sortメソッドを
実行するというものです。
ソートウインドウ、アイテムウインドウ、ターゲットウインドウの3つのうち、
シーンがアイテムに移った直後は、ソートウインドウのみがアクティブになるように
mainのところで、設定したので最初はupdate_sortを実行します。

update_sortでは、Bボタンが押されたときは、メニュー画面に戻る、Cボタンが押されときは
アイテムウインドウに移る、上下ボタンが押されたときは、アイテムウインドウをリフレッシュ
すると言うように設定しました。

次にWindow_Itemクラスのrefreshメソッドの改造です。

  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    if $game_temp.in_battle
      # アイテムを追加
      for i in 1...$data_items.size
        if $game_party.item_number(i) > 0
          @data.push($data_items[i])
        end
      end
    else
      case $scene.sort_window_index
      when 0   # アイテムを追加
        for i in 1...$data_items.size
          if $game_party.item_number(i) > 0
            @data.push($data_items[i])
          end
        end
      when 1   # 武器を追加
        for i in 1...$data_weapons.size
          if $game_party.weapon_number(i) > 0
            @data.push($data_weapons[i])
          end
        end
      when 2   # 防具を追加
        for i in 1...$data_armors.size
          if $game_party.armor_number(i) > 0
            @data.push($data_armors[i])
          end
        end
      end
    end
    #★★★★★★★★★★★★★★★★★★★★★★★★★★★
    # 項目数が 0 でなければビットマップを作成し、全項目を描画
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end

今度は@data = []という部分から # 項目数が・・・という部分までの赤い部分
を付け足します。
ここでは、戦闘中だったらアイテムだけを、またそれ以外で、ソートウインドウのインデックスが
0ならアイテムを、1なら武器を、2なら防具をアイテムウインドウに
表示させるというふうにしています。ソートウインドウのインデックスの参照は
$scene.sort_window_indexで行います。Scene_Itemクラスで、
attr_reader:sort_window_indexを忘れると、Window_Itemクラスで、ソートウインドウの
インデックスの参照ができなくなってしまいますので注意してくださいね( ・`ω・´)。

これで、アイテムが何百個に増えても怖くないと思います。
とはいえ、実は、武器や防具は基本的にはRPGツクールXPでは使えないようになってる
ので、実はこのままではあまりソートの効果はありません。Σ(゚Д゚; エーッ!
ですが、今後アイテム(武器と防具をのぞく)をさらに、分類したいという場合に
今回の方法が役に立ってくると思います。この次はアイテムをさらに分類する方法に
ついて紹介したいと思います。今日はこれまで。
でわまた(^▽^)ノシ
スポンサーサイト

テーマ : RPGツクール
ジャンル : ゲーム

コメントの投稿

管理者にだけ表示を許可する

プロフィール

Suppon

Author:Suppon
すっぽんでーす。(^▽^)
カルドラ鋭意制作中( ・`ω・´)
Twitter => suppon01
メールはこちらへ
suppon2008@gmail.com

Twitter...

Twitter Reload

最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる