[解決済み!!]戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

[解決済み!!]戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by ピータンパン » 2021年6月23日(水) 10:41

お世話サマです!

戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたいです!
drawActorName (actor, x, y, width)で、アクター名を表示してることは分かったのですが
Window_BattleLogメソッドのタイミングで非表示させるよう、drawActorName (' ', x, y, width)と書いて
ActorCommandメソッドのタイミングで再表示させるよう、drawActorName (actor, x, y, width)と
書いてみたのですが、xとyが宣言されていないためエラーとなり、第一引数のactorも取得できませんでした!

Window_BaseクラスをWindow_BattleLogメソッドやActorCommandメソッドで使用するには
インスタンスを作成して呼び出す?のでしょうか?

この辺りの理解ができていません!
もしも助言してくださる奇特な方がいましたらよろしくお願いします!
最後に編集したユーザー ピータンパン on 2021年6月23日(水) 23:44 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by Plasma Dark » 2021年6月23日(水) 11:51

1. 要件
まず、落ち着いて要件を整理するところから始めましょう。実装を行う前に、まずは要件です。

戦闘において、アクターやエネミーが行動している間のみ、画面下部のパーティメンバーの名前とHPMPが表示されているウィンドウから、パーティメンバーの名前を全て削除したい、であっていますか?

2. 検討した内容の提示
実装方法について検討されている内容がいまいち不鮮明です。
ここからわかるのは、jsやツクールの基本的な理解が不足しているであろう、ということくらいですね。

プラグインを書いて実装しようとしたのであれば、その内容をまるごと貼るほうが試したり検討した内容がよく伝わります。
(長いようであれば、gistなどの外部サイトに貼り付けてURLを書いておく、でも良いと思います)

理解が不足していたり、的外れなコードを書いてしまっていることを恥じる必要は全くありません。
最初はそういうものですし、どれほど研鑽を積んだ人でも間違えるケースはあります。人間ですからね。

3. 実装の検討(例)
ツクールの実装では、 Scene_Battle が戦闘中に利用するウィンドウのインスタンスを保持しています。
そこにすでに表示されている内容を制御したい場合、新たにウィンドウのインスタンスを作成しても意味がありません。

画面下部のパーティメンバーが表示されているウィンドウは Window_BattleStatus クラスです。
ここでは確かに drawActorName メソッドを用いてアクター名を表示しています。
(このメソッドは Window_Base クラスから継承されています)

先程確認したように、行動中のみこのウィンドウのパーティメンバーの名前全てを非表示にしたいという要件であったとします。
この場合は、行動中のみ名前を表示しないように書き換えるのが楽です。

コード: 全て選択

(function () {
  'use strict';

  const _Window_BattleStatus_drawActorName = Window_BattleStatus.prototype.drawActorName;
  Window_BattleStatus.prototype.drawActorName = function(actor, x, y, width) {
    if (BattleManager._phase === 'action') {
      return;
    }
    _Window_BattleStatus_drawActorName.call(this, actor, x, y, width);
  };
})();


BattleManager._phase には、戦闘中のフェーズが文字列として記録されています。
行動を処理するフェーズでは、 action という文字列になっています。
上記はその間のみ、名前を描画せずに処理を抜けてしまう、というコードです。
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by ピータンパン » 2021年6月23日(水) 20:03

Plasma Dark 様!!

うぉおおおお!!
できました!!
さ、さすがはPlasma Dark様です!

私の散らかった質問を汲み取って
的確にズバッと解決策を出してくださってありがとうございます!!
要件は、ご指摘のとおりです!

話を整理するのが苦手で、職場でも「まとめてから喋れ!」ってよく怒られてます!すいません!
今度から、編集中のプラグインをちゃんと出すようにしますね!
的外れなコードしか書けたためしがないですけど、どうか今後とも宜しくお願いします!

それと、一点だけ気になるところがあって、
バトルログメッセージが消える前に名前が表示されてしまうので、
アクターコマンドと同じタイミングで表示されるようになんとか試行錯誤してみます!

本当にいつもいつもありがとうございます!!
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by ピータンパン » 2021年6月23日(水) 23:24

タイミングの問題が解決できません……orz
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by Plasma Dark » 2021年6月23日(水) 23:30

バトルログメッセージが消える前に名前が表示されてしまう


こういう状況は起きにくいはずだけど、と思いましたが、行動中の定義がズレていたようですね。
BattleManager._phase が action であるのは、1バトラーが行動をしている間であり、その行動が完了して次のバトラーが行動を始めるまでの間は違う値になります。
行動決定完了後、次に行動選択を行うまでの間を行動中であると定義するのであれば、行動中であるか否かを判定する条件式が変わってきます。

多分、下記のようにするのが一番ラクなんじゃないかと思います。

コード: 全て選択

BattleManager._phase === 'action' || BattleManager._phase === 'turn'


もっと細かく、それこそフレーム単位で表示非表示のタイミングを制御したいとなると、もう少し深い理解が必要になりますが、そうでなければこれで十分ですね。
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 戦闘行動中(攻撃中)にだけアクターの名前を非表示にしたい!

投稿記事by ピータンパン » 2021年6月23日(水) 23:43

Plasma Dark 様!

おおおおーーーーっ!!!
できました!!!
丁度のタイミングです!!

解決コードをいただく前
スイッチを使って、ActorCommandとbattlelogにそれぞれsetを配置してみたのですが
ActorCommandのあとだとBattleStatus_drawActorNameが走らないので
どうにかtrueにしたあとBattleStatus_drawActorNamを走らせる方法をがむしゃらに探していました;;

もうなんとお礼を言えばいいやら。。。。
ありがとうございます!しか言えなくてすいません!
ありがとうございます!ありがとうございます!

今回、[●●のタイミングで実行されるメゾット]という点がいかに重要というか
基本中の基本というか、その辺りが全然把握できてないことがそもそもの問題だと思いました。
鳶嶋工房さんに載ってる戦闘の流れについてちゃんと理解しようと思います!

とにかく最後まで見放さずに解決に導いてくださって
本当にありがとうございました!!
これからは、質問の仕方や、本当に質問すべき内容なのか、もっと事前に考えてから実行に移そうと思います!!

“MV:質問” へ戻る