ページ 11

【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月27日(日) 14:03
by スヴェン
戦闘不能時に指定したターン後に自動で蘇生という設定を組みたくて、それ自体は成功したのですがその時に演出でアニメーションを表示したいと思っています。
下記のフトコロさんが書いたスクリプトで行けそうだと思ったのですがパーティーメンバーの何番目に表示するという内容で並び替えで順番が変わってると別のキャラに表示されてしまいます。
viewtopic.php?t=3983

これをアクター自体に設定する方法は無いでしょうか?
指定したアクターにアニメーションを表示させられれば他の方法でもかまいません、どなたか解決法が思いつく方が居ましたらご教授願います。

Re: 戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月27日(日) 17:49
by ムノクラ
メルト さんが書きました:戦闘不能時に指定したターン後に自動で蘇生という設定を組みたくて、それ自体は成功したのですがその時に演出でアニメーションを表示したいと思っています。
下記のフトコロさんが書いたスクリプトで行けそうだと思ったのですがパーティーメンバーの何番目に表示するという内容で並び替えで順番が変わってると別のキャラに表示されてしまいます。
viewtopic.php?t=3983

これをアクター自体に設定する方法は無いでしょうか?
指定したアクターにアニメーションを表示させられれば他の方法でもかまいません、どなたか解決法が思いつく方が居ましたらご教授願います。
これは、MZの質問で合っているでしょうか?
引用されている投稿からのスクリプトはMV用で、MZだとエラーになると思うのですが…
(アニメーション関係は、MVの情報はほぼMZには流用できません)

パーティ内に探しているアクターがどこに並んでいるかは、下記のスクリプトでindexに代入できます。
アニメーション再生のスクリプトも仕様が変わっています。

例(forしか使えない人間でスイマセン)

コード: 全て選択

const searchActorId = 1;//アニメ対象アクターID
let index = -1;

for (let i = 0; i < $gameParty.members().length; i++) {
    if ($gameParty.members()[i].actorId() === searchActorId) {
        index = i;
    }
};

if (index > -1) {
    let targets = [];
    this.iterateActorIndex(index, actor => {
        targets.push(actor);
    });
    $gameTemp.requestAnimation(targets, 51);//アニメーション51を再生
}
参考
https://fungamemake.com/archives/11361


備考
ケケー氏に教わったところ、下記の書き方で同様の動作になるようです。

コード: 全て選択

const targetId = 1;//アニメ対象アクターID

const targetActor = $gameParty.members().filter(actor => actor._actorId === targetId)[0];
if (targetActor) {
    $gameTemp.requestAnimation([targetActor], 51);//アニメーション51を再生
}

Re: 戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月27日(日) 23:43
by スヴェン
ムノクラさん

MZで合ってます!てっきり流用できるものだと思っていました。
ケケーさんのスクリプトで試してみた所無事やりたかったことが出来ました!
ありがとうございました!

Re: 【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月28日(月) 11:34
by Plasma Dark
本書き込みはバグを防ぐためのコードのお行儀に関する話なので、動けば良いというのであれば無視してください。

細かいことですが、先頭の要素に添え字アクセスするならfilterではなくfindを使うと良いと思います。
https://developer.mozilla.org/en-US/doc ... Array/find
(MVの古い環境の場合はfindが使えないこともありましたが、MZなら問題なく使えます)

_actorIdに直接アクセスしているのも気になります。
今回のケースでは問題になることはないでしょうが、_から始まる変数にクラス外から直接アクセスするコードはバグの原因になることが往々にしてあります。
自分で使うコードならともかく、知見として残すコードには相応しくありません。
https://elleonard.github.io/nplus_doc/2 ... m-outside/

コード: 全て選択

const animationId = 51;
const targetActorId = 1;
const targetActor = $gameParty.members().find(actor => actor.actorId() === targetActorId);
if (targetActor) {
  $gameTemp.requestAnimation([targetActor], animationId);
}
もちろん、filterを使って書くのも悪くないと思います。

コード: 全て選択

const animationId = 51;
const targetActorId = 1;
const targetActors = $gameParty.members().filter(actor => actor.actorId() === targetActorId);
if (targetActors.length > 0) {
  $gameTemp.requestAnimation(targetActors, animationId);
}

Re: 【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月28日(月) 12:09
by ムノクラ
Plasma Dark さんが書きました:本書き込みはバグを防ぐためのコードのお行儀に関する話なので、動けば良いというのであれば無視してください。

細かいことですが、先頭の要素に添え字アクセスするならfilterではなくfindを使うと良いと思います。
https://developer.mozilla.org/en-US/doc ... Array/find
(MVの古い環境の場合はfindが使えないこともありましたが、MZなら問題なく使えます)

_actorIdに直接アクセスしているのも気になります。
今回のケースでは問題になることはないでしょうが、_から始まる変数にクラス外から直接アクセスするコードはバグの原因になることが往々にしてあります。
自分で使うコードならともかく、知見として残すコードには相応しくありません。
https://elleonard.github.io/nplus_doc/2 ... m-outside/

コード: 全て選択

const animationId = 51;
const targetActorId = 1;
const targetActor = $gameParty.members().find(actor => actor.actorId() === targetActorId);
if (targetActor) {
  $gameTemp.requestAnimation([targetActor], animationId);
}
もちろん、filterを使って書くのも悪くないと思います。

コード: 全て選択

const animationId = 51;
const targetActorId = 1;
const targetActors = $gameParty.members().filter(actor => actor.actorId() === targetActorId);
if (targetActors.length > 0) {
  $gameTemp.requestAnimation(targetActors, animationId);
}
ご助言いただき、ありがとうございます。

filterも悪くはないが、findのほうがベターな理由は、下記の解釈で合っているでしょうか?

・今回のケースでは、戦闘パーティ内にアクターがいたら、そのオブジェクトを取得できれば良い。
・対象がアクター1人である。
・findは最初に該当するものが見つかった時点で処理を止める分、処理が少ない。
・filterは全てを拾い出すため、今回のケースでは比較的にfindが向いている。

ちなみに、ケアレスミスだと思いますが、filterの例コードがミスしている気がします。

コード: 全て選択

const animationId = 51;
const targetActorId = 1;
const targetActors = $gameParty.members().filter(actor => actor.actorId() === targetActorId);
if (targetActors.length > 0) {
  $gameTemp.requestAnimation([targetActors], animationId);
}
(targetActorsの前後の[]が抜けているかと…)

Re: 【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月28日(月) 12:34
by Plasma Dark
filterも悪くはないが、findのほうがベターな理由は、下記の解釈で合っているでしょうか?

・今回のケースでは、戦闘パーティ内にアクターがいたら、そのオブジェクトを取得できれば良い。
・対象がアクター1人である。
・findは最初に該当するものが見つかった時点で処理を止める分、処理が少ない。
・filterは全てを拾い出すため、今回のケースでは比較的にfindが向いている。
ご認識の通りです。
(targetActorsの前後の[]が抜けているかと…)
filterで返すのはそもそも配列なので、更に配列にするために[]で囲む必要はありません。

Re: 【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月28日(月) 13:21
by ムノクラ
Plasma Dark さんが書きました:
filterも悪くはないが、findのほうがベターな理由は、下記の解釈で合っているでしょうか?

・今回のケースでは、戦闘パーティ内にアクターがいたら、そのオブジェクトを取得できれば良い。
・対象がアクター1人である。
・findは最初に該当するものが見つかった時点で処理を止める分、処理が少ない。
・filterは全てを拾い出すため、今回のケースでは比較的にfindが向いている。
ご認識の通りです。
(targetActorsの前後の[]が抜けているかと…)
filterで返すのはそもそも配列なので、更に配列にするために[]で囲む必要はありません。
ご返信、ありがとうございます。
確認、認識不足の補足をいただき、ありがとうございました!

Re: 【解決済み】戦闘時に指定したアクターにアニメーションを表示したい

Posted: 2022年3月28日(月) 14:00
by スヴェン
Plasma Darkさん

補足ありがとうございます!
こちらのスクリプトに書き換えさせて頂き、動作も確認致しました!