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

ではスクリプトの解説に移ります。
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ツクール
ジャンル : ゲーム