ページ 11

【解決済】アクターのステートをエネミーに反映(処理速度の向上)

Posted: 2019年11月24日(日) 22:00
by syouji
お世話になります。

戦闘でアクターVSアクターの処理を作成するため
戦闘前にアクターのステートをエネミーに反映させる以下のスクリプトを実装しました。

繰り返し処理(エネミーの数だけ実行){
 繰り返し処理(Loopインデックス 0 ~ 1000){
  if($gameActors.actor(アクターのNO).isStateAffected(Loopインデックス)){
   $gameVariables.setValue(一時変数,$gameActors.actor(アクターのNO)._stateTurns[$gameVariables.value(Loopインデックス)]);
   $gameTroop.members()[敵のNO].addState(Loopインデックス);
   $gameTroop.members()[敵のNO]._stateTurns[Loopインデックス] = 一時変数;
  }
 }
}

しかし、処理が非常に遅く、戦闘が始まるまでに5~6秒かかってしまいます。
ステートのデータが多い(最大数1000を使用)、またエネミーが複数出現するのが原因ですが
なるべくステート数、エネミーの数を減らさずに対応したいと考えています。

アクターのステートをエネミーに一括でコピーする様な
短い時間でアクターのステートをエネミーに反映させる処理は存在しないでしょうか。

ご存知でしたら、教えていただきたいです。

よろしくお願いいたします。

Re: アクターのステートをエネミーに反映(処理速度の向上)

Posted: 2019年11月25日(月) 21:49
by 剣崎 宗二
ループ自体に具体的にどのようなコマンドを使用しているのかが分からないので、ざっくりとですが…
直接コピーは如何でしょうか。

繰り返し処理(エネミーの数だけ実行){
$gameTroop.members()[敵のNO]._states = JsonEx.makeDeepCopy($gameActors.actor(アクターのNO)._states);
$gameTroop.members()[敵のNO]._stateTurns = JsonEx.makeDeepCopy($gameActors.actor(アクターのNO)._stateTurns);
}

Re: アクターのステートをエネミーに反映(処理速度の向上)

Posted: 2019年11月28日(木) 01:01
by syouji
剣崎 宗二 様

お世話になります。

繰り返し処理はツクールMVの機能を使用。
条件分岐で条件を達成した場合、ループの中断を行っていました。

教えていただいたスクリプトを実装したところ
短い処理時間で、ステートと残りターン数 どちらもコピーできました。
テストしてみましたが、処理に問題はなさそうです。

非常に助かりました。
教えていただき、ありがとうございます!