【解決済】 ACE 戦闘中のメッセージについて

しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

【解決済】 ACE 戦闘中のメッセージについて

投稿記事by しろう » 2020年1月30日(木) 06:32

質問させて下さい。

VXAceで戦闘中にコモンイベントなどでメッセージを表示させた時にバトルログと同じように表示させたいのですがメッセージの表示場所を上、背景を黒くしたり白くしたりしてもバトルログと見た目が違うのとウインドウが切り替わる(ステータスウインドウとかも消えてしまう)のがちょっとスムーズではないので違和感を感じてしまいます。

そもそもメッセージだとウインドウが4行分になってますし。

戦闘中のメッセージをバトルログ風にする方法が
あれば教えていただけませんか?
宜しくお願いします。
最後に編集したユーザー しろう on 2020年2月02日(日) 03:03 [ 編集 1 回目 ]

u-kun
記事: 17
登録日時: 2018年4月11日(水) 01:40

Re: ACE 戦闘中のメッセージについて

投稿記事by u-kun » 2020年1月31日(金) 05:21

戦闘中のメッセージは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が見えるようにする必要があります。
というわけで以下のスクリプトを導入してください。

コード: 全て選択

class Scene_Battle < Scene_Base
  attr_reader :log_window
end

あとは「スクリプト」からadd_textを実行するだけです。
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 + "のダメージを受けた!")
という具合です。
しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

Re: ACE 戦闘中のメッセージについて

投稿記事by しろう » 2020年2月01日(土) 02:15

u-kun様、ありがとうございます!
希望通り、バトルログメッセージを扱う事が出来ました。

ただ、ひとつ疑問点が出来ました。
お教え頂いたバトルログメッセージですがスクリプトで表示したメッセージは次の通常のメッセージ
(スクリプトでのメッセージではない)と続けて表示されます。

通常メッセージを〇〇〇、スクリプトでのメッセージを▲▲▲だとして

普通なら

〇〇〇 → 〇〇〇 

のところが

▲▲▲    〇〇〇
〇〇〇 →

こんな感じです。
ちょっと説明が下手ですみません。
これを

▲▲▲ → 〇〇〇

とは出来ますか?
u-kun
記事: 17
登録日時: 2018年4月11日(水) 01:40

Re: ACE 戦闘中のメッセージについて

投稿記事by u-kun » 2020年2月01日(土) 22:55

すみませんメッセージのウェイトと消去について失念していました。

コード: 全て選択

#メッセージをウェイトする
SceneManager.scene.log_window.wait
#エフェクトが消えるまでウェイトする
SceneManager.scene.log_window.wait_for_effect
#表示中のメッセージを消去する
SceneManager.scene.log_window.clear
#ウェイトしてからメッセージを消去する
SceneManager.scene.log_window.wait_and_clear

メッセージの表示に関してこれらの関数が使用できますので、add_textを実行した後に追加してください。
次の文章とまとめて表示されてしまう問題であれば4番目のwait_and_clearで解消できると思います。
しろう
記事: 34
登録日時: 2020年1月25日(土) 17:40

Re: ACE 戦闘中のメッセージについて

投稿記事by しろう » 2020年2月02日(日) 03:02

ありがとうございます!
無事再現出来ました!!

“VX / Ace:質問” へ戻る