ページ 11

【解決済み!!】エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月08日(火) 09:08
by ピータンパン
お世話サマです!

戦闘中のエネミー選択時、任意の座標にそのアクターが今装備している武器名を入れたいと思っています!

要は、どの武器でどのエネミーを攻撃するか
明示させたい感じです!

武器名はこんな感じで取得できました。

コード: 全て選択

        if($gameActors.actor(this._actor._actorId).equips()[0]){
             $gameVariables.setValue(1, $gameActors.actor(this._actor._actorId).equips()[0].name);
        }
トリアコンタン様の動的文字列ピクチャ生成プラグインでやろうとしたのですが
エネミー選択時のみのタイミングとなると無理でした。
それにプラグインコマンドをスクリプトに起こす場合は、
Game_Interpreterとかに書かなきゃいけないみたいで難しいです。

何か良い方法はありますでしょうか!?
drawTextとかで表示できたらと思っています!

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月08日(火) 20:59
by WTR
武器名は取得出来た…ということなんですが
そのスクリプトをどこに書いて取得出来たんでしょうか?
誰から見た this._actor なんでしょう…

$gameActors.actor(this._actor._actorId) は this._actor と一緒じゃないの…と予想。
ピータンパン さんが書きました:エネミー選択時のみのタイミングとなると無理でした。
これも具体的にはなぜ無理だったのでしょうか。
エネミー選択中かどうかがわからない、ということですか?

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月08日(火) 22:06
by ピータンパン
WTR 様!

あーそうですよねー
情報が足りなさ過ぎでしたね!

>そのスクリプトをどこに書いて取得出来たんでしょうか?

色々試したのですが、ActorcCommand以外だとエラーになるので
ActorCommand関数内で取りました!
なんとなく他の質問を見るかぎり、ここじゃダメなんだろうなーってのは分かったんですけど、
他に取れるところがなかったので仕方なく・・・やっぱダメですかっ?

>$gameActors.actor(this._actor._actorId) は this._actor と一緒じゃないの…と予想。

た、確かに・・・。
全然、気づきませんでした;;
this._actorで十分ですね!

色々なサイトやここの質問からくすねてきた何となく行けそうなコードをコピペして
動かなければ次って感じで何とか今まで凌いできました!
でも今回はピンポイントすぎてコピペで対応できるケースがなかったです。

動的文字列ピクチャ生成プラグインは、
まずどこでもいいので表示できないかなと、以下のように記述してみたんですけどダメでした。

コード: 全て選択

this.pluginCommand('D_TEXT test');
this.pluginCommand('D_TEXT_SETTING ALIGN 2');
this.pluginCommand('D_TEXT_SETTING REAL_TIME ON');
$gameScreen.showPicture(99,'',1,150,220,100,100,255,0);
データベース上の設定だと画像名は空欄なので、''にしてます!
これはどこの関数に入れてもエラーでした。
D_TEXTのシングルクォートを外したり、引数をくっつけたりしてみたんですけど
エラーが改善されなかったので諦めたんですorz

このように散々な状態です!

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月08日(火) 23:17
by WTR
戦闘中にピクチャ表示ってそういえばやったことがなかったので
うまくやれるものかよくわかっていませんが

動的文字列ピクチャ生成プラグインは

コード: 全て選択

this.pluginCommand("D_TEXT", [”test”]);
this.pluginCommand("D_TEXT_SETTING", ["ALIGN", "2"]);
this.pluginCommand("D_TEXT_SETTING", ["REAL_TIME", "ON"]);
$gameScreen.showPicture(99,"",1,150,220,100,100,255,0);
・プラグインコマンド名 D_TEXT とか自体を "D_TEXT" とする 'D_TEXT' でも同じ
・プラグイン名と引数は ", " で区切る
・引数は配列にする
・引数の配列の各要素も"ALIGN", "2" のように文字列型にする

これでとりあえず表示できました。

が、並列処理的なことができないとイベントでは出来ないんじゃないかなぁ…という気もします。

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 00:13
by ピータンパン
WTR様

ありがとうございます!

そうですねー
表示されるようにはなりましたけど
確かに並列的な処理ができないので使いどころは難しいですね!

ピクチャの表示と消去をエネミーの選択前と選択後に配置すれば
出来る気はするのですけど、全くやり方が分からないです。

なんとかヘルプテキストのような感じで
独立した文字列を表示できたらいいんですけど、やっぱり難しいですかね・・・。

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 00:41
by WTR
ものすごく雑なんですけど…
一応、動的文字列プラグインとあわせて
エネミー選択ウィンドウの開閉タイミングで変数とピクチャを操作することで
なんとなくそれっぽいことが出来たような気はします。

ピクチャ番号とか座標とか、変数番号とか、ベタ書きしてしまったのでなんとも残念な感じですが…

あと、スクリプトでプラグインコマンドを書くと
REAL_TIME ON の対象になる変数が指定できないような気がしたので
通常のプラグインコマンド記述にしました。

コード: 全て選択

◆プラグインコマンド:D_TEXT \V[1]
◆プラグインコマンド:D_TEXT_SETTING ALIGN 2
◆プラグインコマンド:D_TEXT_SETTING REAL_TIME ON
◆ピクチャの表示:#99, なし, 中央 (150,220), (100%,100%), 255, 通常

コード: 全て選択

(() => {
"use strict"
    const _Scene_Battle_selectEnemySelection = Scene_Battle.prototype.selectEnemySelection;
    Scene_Battle.prototype.selectEnemySelection = function() {
        // コマンド入力中のアクターの武器を変数1に代入
        const actor = BattleManager.actor();
        const weaponName = actor && actor.equips()[0] ? actor.equips()[0].name : "";
        $gameVariables.setValue(1, weaponName);
        // 変数1が空でなかったらピクチャを再表示する
        if ($gameVariables.value(1)) {
            $gameScreen.movePicture(99,1,150,220,100,100,255,0,1);
        }
        _Scene_Battle_selectEnemySelection.call(this);
    };
    
    const _Scene_Battle_onEnemyOk = Scene_Battle.prototype.onEnemyOk;
    Scene_Battle.prototype.onEnemyOk = function() {
        // ピクチャ隠す
        $gameScreen.movePicture(99,1,150,220,100,100,0,0,1);
        _Scene_Battle_onEnemyOk.call(this);
    };
    
    const _Scene_Battle_onEnemyCancel = Scene_Battle.prototype.onEnemyCancel;
    Scene_Battle.prototype.onEnemyCancel = function() {
        // ピクチャ隠す
        $gameScreen.movePicture(99,1,150,220,100,100,0,0,1);
        _Scene_Battle_onEnemyCancel.call(this);
    };
})();

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 01:16
by ピータンパン
WTR 様

おおおおっ!!
こ、これはすごい!!バッチリ出来てますねっ!
ひぇ~ホントにありがとうございます!!

戦闘グループのイベントに「バトル」「ターン0」で
プラグインコマンドをセットしたら表示/非表示がしっかりできてました!
こんなものをサクッと作れるなんて羨ましすぎます!

武器じゃない場合(アイテムとかスキルの場合)もあるので
そのあたりは条件分岐でなんと頑張ってみますね!!

いやーお願いした甲斐がありました!
私の質問の仕方が悪すぎたので、もう無理かーって思ってましたので
ホントに助かりました!!

明日、じっくり触ってみて、
またお助け~ってなるかもですけど
そのときはもしよろしければ手を差し伸べてもらえると感謝です!!

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 13:46
by ピータンパン
WTR様

すみません!
お助けください!

エネミー選択の段階で、「プレイヤーがどの戦闘コマンドを選んだか」って、
どうやったら取得できますか!?
攻撃、アイテム、スキル、それぞれActorCommandの関数内とかで取れたりしますか!?

どうかお願いします!!

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 15:34
by WTR
まず結論だけ書くと

コード: 全て選択

        const actor = BattleManager.actor();
        const weaponName = actor && actor.equips()[0] ? actor.equips()[0].name : "";
        $gameVariables.setValue(1, weaponName);
ここを

コード: 全て選択

        const actor = BattleManager.actor();
        const actionName = actor && actor.currentAction() ? actor.currentAction().item().name : "";
        $gameVariables.setValue(1, actionName);
とかにすると、スキル・アイテム名が取れます。
違う変数・ピクチャ番号を使う等、工夫してみて頂けますでしょうか。

以下余談
ピータンパン さんが書きました:色々試したのですが、ActorcCommand以外だとエラーになるので
ActorCommand関数内で取りました!
なんとなく他の質問を見るかぎり、ここじゃダメなんだろうなーってのは分かったんですけど、
他に取れるところがなかったので仕方なく・・・やっぱダメですかっ?
ピータンパン さんが書きました:攻撃、アイテム、スキル、それぞれActorCommandの関数内とかで取れたりしますか!?
Window_ActorCommand クラスですよね。
ちょっと話は戻りますが
Window_ActorCommand における this._actor を参照するのがダメなのかというと…
Window_ActorCommand 内に処理を追加するなら別に構わないと思います。

私は Scene_Battle に処理を追加して BattleManager.actor() を参照するように書きましたが
実をいうと Scene_Battle の startActorCommandSelection() という処理を通過した時点で
この this._actor とBattleManager.actor() は同一のアクターオブジェクトになります。
細かいことは省きますが、結果は同じです。

ただ…
Scene_Battle が 各種ウィンドウを子要素に持っているのですが
ウィンドウ同士はお互いの状態をあまり気にしていなくて、その状態管理は Scene_Battle が担当しています。

今回はエネミー選択ウィンドウ (Window_BattleEnemy) の開閉状態でピクチャを制御しようという話でしたが
Window_ActorCommand は Window_BattleEnemy の状態を知らないので
Window_ActorCommand 内で全部処理させるのは微妙だし this._actor を使うのはやめよう
ついでに上の階層 … Scene_Battle に処理させようかな、と考えた次第です。

Re: エネミー選択時、任意の場所に文字列を表示させたい!

Posted: 2021年6月09日(水) 20:50
by ピータンパン
WTR様

あぁあぁぁあ・・・ありがとうございますっ!!
今度こそ本当に実現できました!!

何から何までおんぶにだっこでごめんなさい!
まさかこんなにキッチリしっかりできるなんて思ってなかったので
もうありがたいというか、なんというか、そういう次元の話じゃないです!

こんなどこの馬の骨かも分からない昼行燈にやさしくしてくれるWTR様には
きっと幸せな未来しか訪れないことでしょうっ!!

ふざけてるわけじゃなくてホントに感謝しかありません!!
心からありがとうございます!!

その上、こんな色々と教えていただいて
頼んだり聞いたりした私が言うのも変なんですけど
赤の他人に無償でここまで親身になって解決手段まで提供してくれるなんて、
普通じゃ有り得ないことですよね!

だから、どう感謝の気持ちを表していいか分からないですけど
とにかく伝わってくれたら嬉しいです!

Window_ActorCommand 内に処理を追加しても問題ないんですね!
ただし、ざっくり言うと設計によっては危うい場合もあるので推奨はしないということですね!
何か問題が出た時の原因材料として覚えておきます!!

ホントにホントにありがとうございました!!