11.戦闘画面
1.ステータスに顔グラを表示する
戦闘画面を変更したいので、まず調べるのは Scene_Battle クラスですね。
ウィンドウの作成は、基本的には start メソッドで行われるので、こちらを確認します。
create_status_window が怪しいですね。
create_status_window をダブルクリックで選択。Ctrl+F で検索。すぐに定義が見つかります。
Window_BattleStatus クラスがありますので、セクションよりこのクラス定義を確認すると、
『バトル画面で、パーティメンバーのステータスを表示するウィンドウです。』
はい、戦闘画面のステータスウィンドウですね。今回は、表示を変更するだけですので、
この Window_BattleStatus クラスを変更するだけでよさそうです。
とりあえず、顔グラを表示させてみます。
顔グラの描画は、Window_Base#draw_actor_face で行います。
描画処理といえば、refresh メソッドですね。定義があるかを確認します。
選択処理のあるウィンドウですので、大抵は draw_item メソッドが定義されています。
refresh で draw_item を項目の数だけ呼び出して描画するというような方法がよく使われています。
例によって、draw_all_items が呼び出されており、その下に draw_item が定義されていますね。
Window_Selectable クラスを継承したクラスは、ほぼこのような処理になっています。
draw_all_items は、Window_Selectable クラスで定義されており
draw_item をオーバーライドするというような形になっています。
ということで Window_BattleStatus#draw_item に draw_actor_face の処理を追加します。
実行してみると顔グラが表示されているのがわかると思います。
ここから、名前の下に顔グラを表示するように変更したいと思います。
今までの変更は必要ないので消しちゃってください。
draw_item では、draw_basic_area と draw_gauge_area があり、
おそらく名前やステートとゲージを分けて描画しているのでしょう。
名前の下に描画したいので、draw_basic_area を変更するのがスマートかと思います。
basic_area_rect から描画範囲なども設定されていると予想できます。
プリセットの顔グラ描画メソッドは、全体を描画固定ですので、その辺も修正する必要があります。
Window_Base#draw_face を Window_BattleStatus クラスにコピペしてください。
draw_basic_area に顔グラを描画する処理を追加し、
オーバーライドした draw_face の顔グラサイズを変更します。
最後に顔グラを別ファイルで用意して描画する方法に変更したいと思います。
仕様としては、通常の顔グラのファイル名の先頭に B の文字をつけたものを
戦闘時の顔グラとして表示したいと思います。
とりあえず、こんな感じで顔グラを用意して、同じフォルダに保存します。
んで、下記のようにスクリプトを変更します。
たった、これだけで、別ファイルを使用できるようになりました。
ウィンドウの作成は、基本的には start メソッドで行われるので、こちらを確認します。
create_status_window が怪しいですね。
create_status_window をダブルクリックで選択。Ctrl+F で検索。すぐに定義が見つかります。
Window_BattleStatus クラスがありますので、セクションよりこのクラス定義を確認すると、
『バトル画面で、パーティメンバーのステータスを表示するウィンドウです。』
はい、戦闘画面のステータスウィンドウですね。今回は、表示を変更するだけですので、
この Window_BattleStatus クラスを変更するだけでよさそうです。
とりあえず、顔グラを表示させてみます。
顔グラの描画は、Window_Base#draw_actor_face で行います。
描画処理といえば、refresh メソッドですね。定義があるかを確認します。
選択処理のあるウィンドウですので、大抵は draw_item メソッドが定義されています。
refresh で draw_item を項目の数だけ呼び出して描画するというような方法がよく使われています。
例によって、draw_all_items が呼び出されており、その下に draw_item が定義されていますね。
Window_Selectable クラスを継承したクラスは、ほぼこのような処理になっています。
draw_all_items は、Window_Selectable クラスで定義されており
draw_item をオーバーライドするというような形になっています。
ということで Window_BattleStatus#draw_item に draw_actor_face の処理を追加します。
実行してみると顔グラが表示されているのがわかると思います。
ここから、名前の下に顔グラを表示するように変更したいと思います。
今までの変更は必要ないので消しちゃってください。
draw_item では、draw_basic_area と draw_gauge_area があり、
おそらく名前やステートとゲージを分けて描画しているのでしょう。
名前の下に描画したいので、draw_basic_area を変更するのがスマートかと思います。
basic_area_rect から描画範囲なども設定されていると予想できます。
プリセットの顔グラ描画メソッドは、全体を描画固定ですので、その辺も修正する必要があります。
Window_Base#draw_face を Window_BattleStatus クラスにコピペしてください。
draw_basic_area に顔グラを描画する処理を追加し、
オーバーライドした draw_face の顔グラサイズを変更します。
最後に顔グラを別ファイルで用意して描画する方法に変更したいと思います。
仕様としては、通常の顔グラのファイル名の先頭に B の文字をつけたものを
戦闘時の顔グラとして表示したいと思います。
とりあえず、こんな感じで顔グラを用意して、同じフォルダに保存します。
んで、下記のようにスクリプトを変更します。
たった、これだけで、別ファイルを使用できるようになりました。
2.素手のときは通常攻撃を不可にする
武器を装備していない場合の変更点
1.攻撃コマンドを選択できないようにする
2.攻撃コマンドが選ばれたらブザーを鳴らす
3.攻撃コマンドを半透明で描画する
4.初期選択コマンドを「防御」にする
まず、コマンド処理がどのように行われているのか Scene_Battle#update を確認します。
update_actor_command_selection という処理が見つかるのでそちらを確認しましょう。
ここでコマンド選択の分岐が行われていますね。
次に、コマンドウィンドウがどのように生成されているか Scene_Battle#start 確認します。
create_info_viewport で Window_ActorCommand クラスから生成されていますね。
クラスが分かったので Window_ActorCommand クラスの定義を見に行きます。
Window_ActorCommand#setup にあるようにアクターごとに再描画されいるようです。
Scene_Battle に戻って @actor_command_window.setup で検索すると1か所ヒットします。
start_actor_command_selection から @active_battler でアクターを参照できることがわかります。
では、1番から順に実装していきましょう。
コマンド処理は update_actor_command_selection でしたね。
武器なしのとき処理を中断したいのでエイリアスが使えそうですね。
@active_battler.weapons.any? が武器を装備しているとき真となります。
@active_battler.weapons は配列操作含まれるため毎フレーム実行しないよう注意して次のようにします。
正攻法でこのクラスに変更を加えても良いのですが、シーンクラスでも変更できそうなので 今回は start_actor_command_selection を変更します。
通常通りウィンドウの生成をしますが、武器を装備していない場合は項目を再描画するよう処理を追加します。
1.攻撃コマンドを選択できないようにする
2.攻撃コマンドが選ばれたらブザーを鳴らす
3.攻撃コマンドを半透明で描画する
4.初期選択コマンドを「防御」にする
まず、コマンド処理がどのように行われているのか Scene_Battle#update を確認します。
update_actor_command_selection という処理が見つかるのでそちらを確認しましょう。
ここでコマンド選択の分岐が行われていますね。
次に、コマンドウィンドウがどのように生成されているか Scene_Battle#start 確認します。
create_info_viewport で Window_ActorCommand クラスから生成されていますね。
クラスが分かったので Window_ActorCommand クラスの定義を見に行きます。
Window_ActorCommand#setup にあるようにアクターごとに再描画されいるようです。
Scene_Battle に戻って @actor_command_window.setup で検索すると1か所ヒットします。
start_actor_command_selection から @active_battler でアクターを参照できることがわかります。
では、1番から順に実装していきましょう。
コマンド処理は update_actor_command_selection でしたね。
武器なしのとき処理を中断したいのでエイリアスが使えそうですね。
@active_battler.weapons.any? が武器を装備しているとき真となります。
@active_battler.weapons は配列操作含まれるため毎フレーム実行しないよう注意して次のようにします。
class Scene_Battle #-------------------------------------------------------------------------- # ● アクターコマンド選択の更新 #-------------------------------------------------------------------------- alias _cao_update_actor_command_selection update_actor_command_selection def update_actor_command_selection # 「攻撃」が選択されているか attack_command_selected = Input.trigger?(Input::C) && @actor_command_window.index == 0 if attack_command_selected && !@active_battler.weapons.any? # 「攻撃」選択され、武器を装備していない場合はブザーを鳴らす Sound.play_buzzer else # 「攻撃」以外なら元の処理を実行する _cao_update_actor_command_selection end end end次は、3番からの実装です。Window_ActorCommand クラスでしたね。
正攻法でこのクラスに変更を加えても良いのですが、シーンクラスでも変更できそうなので 今回は start_actor_command_selection を変更します。
通常通りウィンドウの生成をしますが、武器を装備していない場合は項目を再描画するよう処理を追加します。
class Scene_Battle #-------------------------------------------------------------------------- # ● アクターコマンド選択の開始 #-------------------------------------------------------------------------- alias _cao_start_actor_command_selection start_actor_command_selection def start_actor_command_selection _cao_start_actor_command_selection # 武器を装備していない場合 unless @active_battler.weapons.any? # 「攻撃」を半透明で再描画 @actor_command_window.draw_item(0, false) # カーソルの初期位置を「防御」に変更 @actor_command_window.index = 2 end end end
3.ターン数を表示するウィンドウを追加する
シーンにウィンドウを追加する場合は、シーンクラス#start に処理を追加します。
今回は戦闘画面ですので Scene_Battle#start ですね。
コマンドやステータスは @info_viewport 内にあるようですが、
ターンウィンドウはその上に配置してビューポートには入れずに別管理したいと思います。
「ターン」で全検索すると Game_Troop#turn_count がヒットしますね。
さらに増加について調べると increase_turn が見つかります。
さらに全検索をかけると実行されているのは Scene_Battle#start_main 1か所のみ。
さらに検索すると start_main は、行動が決定されて処理を開始する前に実行されています。
つまりターンの増加はコマンド選択後ということですね。
ターンの始まりはパーティコマンド選択なので start_party_command_selection でターン数の更新をします。
@info_viewport.visible = false を検索して、そこで非表示にすれば良いでしょう。
何ヶ所かヒットしますが消すのは、ウィンドウ生成時と start_main だけで良さそうです。
が、
スキルやアイテム選択時にウィンドウが重なるので、その時も非表示にしたいと思います。
Scene_Battle#update を見るとオブジェクトの有無の分岐しています。
変数名で確認するとコマンド選択の度に新しいウィンドウを生成しているようです。
それぞれの選択開始と終了処理に処理を加えても良いですが、4ヶ所も変えたくないのでupdateに処理を加えようと思います。
そのついでに @info_viewport.visible の状態も見てターンウィンドウの表示の有無をまとめて決定したいと思います。
今回は戦闘画面ですので Scene_Battle#start ですね。
コマンドやステータスは @info_viewport 内にあるようですが、
ターンウィンドウはその上に配置してビューポートには入れずに別管理したいと思います。
class Scene_Battle #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias _cao_start start def start _cao_start @turn_window = Window_Base.new(0, 0, 200, 56) @turn_window.x = Graphics.width - @turn_window.width @turn_window.y = @info_viewport.rect.y - @turn_window.height end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- alias _cao_terminate terminate def terminate _cao_terminate @turn_window.dispose end end次にターン数を取得します。
「ターン」で全検索すると Game_Troop#turn_count がヒットしますね。
さらに増加について調べると increase_turn が見つかります。
さらに全検索をかけると実行されているのは Scene_Battle#start_main 1か所のみ。
さらに検索すると start_main は、行動が決定されて処理を開始する前に実行されています。
つまりターンの増加はコマンド選択後ということですね。
ターンの始まりはパーティコマンド選択なので start_party_command_selection でターン数の更新をします。
class Scene_Battle
#--------------------------------------------------------------------------
# ● パーティコマンド選択の開始
#--------------------------------------------------------------------------
alias _cao_start_party_command_selection start_party_command_selection
def start_party_command_selection
if $game_temp.in_battle
@turn_window.contents.instance_eval do
clear
draw_text(rect, "ターン #{$game_troop.turn_count + 1}", 1)
end
end
_cao_start_party_command_selection
end
end
次にウィンドウの表示はコマンド選択時のみに変更します。@info_viewport.visible = false を検索して、そこで非表示にすれば良いでしょう。
何ヶ所かヒットしますが消すのは、ウィンドウ生成時と start_main だけで良さそうです。
が、
スキルやアイテム選択時にウィンドウが重なるので、その時も非表示にしたいと思います。
Scene_Battle#update を見るとオブジェクトの有無の分岐しています。
変数名で確認するとコマンド選択の度に新しいウィンドウを生成しているようです。
それぞれの選択開始と終了処理に処理を加えても良いですが、4ヶ所も変えたくないのでupdateに処理を加えようと思います。
そのついでに @info_viewport.visible の状態も見てターンウィンドウの表示の有無をまとめて決定したいと思います。
class Scene_Battle #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias _cao_start start def start _cao_start @turn_window = Window_Base.new(0, 0, 200, 56) @turn_window.x = Graphics.width - @turn_window.width @turn_window.y = @info_viewport.rect.y - @turn_window.height @turn_window.visible = false end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias _cao_update update def update @turn_window.visible = @info_viewport.visible && !(@skill_window || @item_window) _cao_update end end
4.
5.