質問させて下さい。
VXAceで戦闘中にコモンイベントなどでメッセージを表示させた時にバトルログと同じように表示させたいのですがメッセージの表示場所を上、背景を黒くしたり白くしたりしてもバトルログと見た目が違うのとウインドウが切り替わる(ステータスウインドウとかも消えてしまう)のがちょっとスムーズではないので違和感を感じてしまいます。
そもそもメッセージだとウインドウが4行分になってますし。
戦闘中のメッセージをバトルログ風にする方法が
あれば教えていただけませんか?
宜しくお願いします。
【解決済】 ACE 戦闘中のメッセージについて
【解決済】 ACE 戦闘中のメッセージについて
最後に編集したユーザー しろう [ 2020年2月02日(日) 03:03 ], 累計 1 回
Re: ACE 戦闘中のメッセージについて
戦闘中のメッセージはWindow_BattleLogクラスのadd_textという関数によって行われています。
戦闘そのものはScene_Battleクラスで処理されているため、その中でWindow_BattleLogが生成されているわけです。
この時の生成の受け皿となっている変数が@log_windowなので、
Scene_Battleの中では@log_window.add_text(hoge)と記述することで戦闘中のメッセージを表示することができます。
しかし、イベントコマンドの「スクリプト」はGame_Interpreterクラスで処理されています。
Game_InterpreterとScene_Battleは何の関係もないので、
Game_Interpreter上での処理である「スクリプト」からはScene_Battleがどんな変数を持っているのかがわかりません。
よって、まずはScene_Battleにlog_windowという変数が存在することを明らかにし、
Game_Interpreterからlog_windowが見えるようにする必要があります。
というわけで以下のスクリプトを導入してください。
あとは「スクリプト」からadd_textを実行するだけです。
SceneManagerモジュールのsceneという関数を呼び出すと実行中のシーンにアクセスすることができるので、
となります。
なお、スクリプト上では数値としての123と文字列としての"123"は全く違うものです。
add_textは文字列しか受け付けない関数なので、数値が入った変数などは後ろに.to_sを付けて文字列に変換しなければなりません。
また、通常のテキストウィンドウと同様に制御文字を使用することができますが、
\N[1]ではなく\\N[1]というように「\」を2つ記述する必要があります。
damage = 123
add_text("\\N[1]は" + damage.to_s + "のダメージを受けた!")
という具合です。
戦闘そのものはScene_Battleクラスで処理されているため、その中でWindow_BattleLogが生成されているわけです。
この時の生成の受け皿となっている変数が@log_windowなので、
Scene_Battleの中では@log_window.add_text(hoge)と記述することで戦闘中のメッセージを表示することができます。
しかし、イベントコマンドの「スクリプト」はGame_Interpreterクラスで処理されています。
Game_InterpreterとScene_Battleは何の関係もないので、
Game_Interpreter上での処理である「スクリプト」からはScene_Battleがどんな変数を持っているのかがわかりません。
よって、まずはScene_Battleにlog_windowという変数が存在することを明らかにし、
Game_Interpreterからlog_windowが見えるようにする必要があります。
というわけで以下のスクリプトを導入してください。
コード: 全て選択
class Scene_Battle < Scene_Base
attr_reader :log_window
end
SceneManagerモジュールのsceneという関数を呼び出すと実行中のシーンにアクセスすることができるので、
コード: 全て選択
#戦闘中でなければ実行しない
return unless SceneManager.scene_is?(Scene_Battle)
#メッセージの表示
SceneManager.scene.log_window.add_text(
"ほげほげ"
)
なお、スクリプト上では数値としての123と文字列としての"123"は全く違うものです。
add_textは文字列しか受け付けない関数なので、数値が入った変数などは後ろに.to_sを付けて文字列に変換しなければなりません。
また、通常のテキストウィンドウと同様に制御文字を使用することができますが、
\N[1]ではなく\\N[1]というように「\」を2つ記述する必要があります。
damage = 123
add_text("\\N[1]は" + damage.to_s + "のダメージを受けた!")
という具合です。
Re: ACE 戦闘中のメッセージについて
u-kun様、ありがとうございます!
希望通り、バトルログメッセージを扱う事が出来ました。
ただ、ひとつ疑問点が出来ました。
お教え頂いたバトルログメッセージですがスクリプトで表示したメッセージは次の通常のメッセージ
(スクリプトでのメッセージではない)と続けて表示されます。
通常メッセージを〇〇〇、スクリプトでのメッセージを▲▲▲だとして
普通なら
〇〇〇 → 〇〇〇
のところが
▲▲▲ 〇〇〇
〇〇〇 →
こんな感じです。
ちょっと説明が下手ですみません。
これを
▲▲▲ → 〇〇〇
とは出来ますか?
希望通り、バトルログメッセージを扱う事が出来ました。
ただ、ひとつ疑問点が出来ました。
お教え頂いたバトルログメッセージですがスクリプトで表示したメッセージは次の通常のメッセージ
(スクリプトでのメッセージではない)と続けて表示されます。
通常メッセージを〇〇〇、スクリプトでのメッセージを▲▲▲だとして
普通なら
〇〇〇 → 〇〇〇
のところが
▲▲▲ 〇〇〇
〇〇〇 →
こんな感じです。
ちょっと説明が下手ですみません。
これを
▲▲▲ → 〇〇〇
とは出来ますか?
Re: ACE 戦闘中のメッセージについて
すみませんメッセージのウェイトと消去について失念していました。
メッセージの表示に関してこれらの関数が使用できますので、add_textを実行した後に追加してください。
次の文章とまとめて表示されてしまう問題であれば4番目のwait_and_clearで解消できると思います。
コード: 全て選択
#メッセージをウェイトする
SceneManager.scene.log_window.wait
#エフェクトが消えるまでウェイトする
SceneManager.scene.log_window.wait_for_effect
#表示中のメッセージを消去する
SceneManager.scene.log_window.clear
#ウェイトしてからメッセージを消去する
SceneManager.scene.log_window.wait_and_clear
次の文章とまとめて表示されてしまう問題であれば4番目のwait_and_clearで解消できると思います。
Re: ACE 戦闘中のメッセージについて
ありがとうございます!
無事再現出来ました!!
無事再現出来ました!!