【完了】【質問】イベント毎にタイマー的機能を追加する方法

munokura

ユーザー
下記で教えていただいた PlayerSensor.js を使用してシンボルエンカウントの実装を試みています。

シンボルに見つかって避けて行く時に、30秒逃げ続けるとシンボルが追跡を諦めるのを、移動ルートで指定できないか試みていますが、どうにも上手く行きません。

試したこと

下記を参考に試してみました。

1.シンボルが追いかけるのに下記スクリプトを使用
this.moveStraight(this.findDirectionTo($gamePlayer.x,$gamePlayer.y));

2.シンボルが諦めるのに下記スクリプトを使用
if( Graphics.frameCount % 600 === \0 ){$gameSelfSwitches.setValue([this._mapId, this._eventId, "A"], false)};

1.2.を繰り返す設定になっています。

2.で30秒逃げ続けるとセルフスイッチAをOFFにして、諦めた状態にするという考えだったのですが、そもそも「Graphics.frameCount」を使用するのに無理があったのだと予想しています。

$gameSelfSwitches.setValue([this._mapId, this._eventId, "A"], false)
のみにすると、視界から外れるとセルフスイッチがOFFになります。

独自の変数を指定して、フレーム数をカウントさせるほうが良いのかな?と考え下記のように書いたのですが、諦める動作をしてくれません。

countがNaNを返してしまいます。

JavaScript:
this.moveStraight(this.findDirectionTo($gamePlayer.x, $gamePlayer.y));
let count;
count = parseInt(count + 1);
if (count === 360) {
    $gameSelfSwitches.setValue([this._mapId, this._eventId, "A"], false)
};
console.log(count);
上記は改行していますが、移動ルートのスクリプトでは改行を削除して、一箇所に入れています。
(過去にスクリプトの枠を別にするとスコープが別になるとか聞いた記憶があったもので)
SS01.png
 

DarkPlasma

ユーザー
countがNaNを返してしまいます。
undefinedに1を足してもNaNになりますからね。(countを初期化せずに1を足している)
これ、移動ルートのスクリプトで完結しないといけないものでしょうか。

セルフスイッチAがONのときに並列処理で動き続けるのであれば、移動ルートの外に追い出しちゃったほうが保守の面でも諸々良さそうに思えます。
フレーム数でやるか実時間でやるかはどちらが良いのかわかりませんが、どちらにしてもイベントの組み方でなんとでもなりそうです。

1ページ目:
コード:
◆条件分岐:スクリプト:視界にプレイヤーを捉えている
  ◆セルフスイッチの操作:A = ON
  ◆
:分岐終了
2ページ目: セルフスイッチA=ONのとき
コード:
◆移動ルートの設定:このイベント (ウェイト)
:        :◇スクリプト:this.moveStraight(this.findDirectionTo($gamePlayer.x, $gamePlayer.y))
◆条件分岐:スクリプト:視界にプレイヤーがいない
  ◆セルフスイッチの操作:B = ON
  ◆変数の操作:#0015 視界外追跡時間 = 0
  ◆
:分岐終了
3ページ目: セルフスイッチB=ONのとき
コード:
◆移動ルートの設定:このイベント (ウェイト)
:        :◇スクリプト:this.moveStraight(this.findDirectionTo($gamePlayer.x, $gamePlayer.y))
◆条件分岐:スクリプト:視界にプレイヤーを捉えている
  ◆セルフスイッチの操作:B = OFF
  ◆変数の操作:#0015 視界外追跡時間 = 0
  ◆
:それ以外のとき
  ◆変数の操作:#0015 視界外追跡時間 += 1
  ◆条件分岐:視界外追跡時間 ≥ 1800
    ◆セルフスイッチの操作:A = OFF
    ◆セルフスイッチの操作:B = OFF
    ◆
  :分岐終了
  ◆
:分岐終了
条件分岐のスクリプトは適宜読み替えてください。
視界外追跡時間はイベントごとに用意する必要があります。
イベントのセルフ変数的なものを実現するとか、あるいはイベントごとにタイマーを用意して起動したりリセットするプラグインを用意できるのであれば、それに置き換えても良いと思います。
 

munokura

ユーザー
アドバイスを頂き、ありがとうございます。

ルートのスクリプトで初期化(let count = 0;)をすると、延々1のまま進まないので、諦めていました。
色々駆使すれば可能かもしれませんが、ご指摘の通り見通しは悪いかと思います。

トリガーを並行処理にして移動に当ててしまうと、「イベントから接触」が使用できなくなるので、考慮から外していました。

もし、トリガーを並行処理にして、エンカウント処理をうまく出来るのであれば(プレイヤーとの距離が1になったらエンカウントとかでしょうか?)並行処理も現実的に見えてきます。

1つイベントを作成したらそれをコピペで量産できるイベントを作成したかったので、現状では非現実的と受け入れる必要がありそうですね。


セルフ変数を導入するプラグインがあれば、コピペで量産できるイベントも可能かと思いますが、自分は初心者が望むであろう実装方法を解説したいという動機が強くあります。
先日のSymbolEncountLibMZでも、イベント毎に別変数の用意が必要ですし、なかなか解説に向いた簡易で柔軟なプラグインはないのが現状のようですね。
 

DarkPlasma

ユーザー
ルートのスクリプトで初期化(let count = 0;)をすると、延々1のまま進まないので、諦めていました。
それはそうです。実行ごとにスコープが変わるので、何か状態を引き継ぎたいと思ったら外のスコープで定義された何かを書き換えねばなりません。

トリガーを並行処理にして移動に当ててしまうと、「イベントから接触」が使用できなくなるので、考慮から外していました。

もし、トリガーを並行処理にして、エンカウント処理をうまく出来るのであれば(プレイヤーとの距離が1になったらエンカウントとかでしょうか?)並行処理も現実的に見えてきます。
確かに、戦闘開始の処理が微妙なことになりそうです。
衝突判定の自前実装は初心者には辛かろうと思うので、私が提示した方法ではあまり簡単にならなさそうですね。

カスタムルートの中でスクリプトをこねくり回すより、追跡中であるかどうかを表すメソッドをGame_Eventクラスに生やすようなプラグインを書いてしまったほうが簡単そうです。
自律移動のメソッドをフックしてメモ欄の記述でプレイヤーを追いかけるイベントを作れるようにしてしまっても良いと思います。

……結局、シンボルエンカウントを実現するためのプラグインを半ば自作することになりそうですね。
とは言え、視野周りのコードはすでにあるので、それに対して追加する形で書けば、無駄な再実装はしなくても済むでしょう。

自分は初心者が望むであろう実装方法を解説したいという動機が強くあります。
言うまでもないことかもしれませんが、もしそうであるなら尚の事、スクリプトで頑張るべきではありません。
読んで理解できないコードを書くということは、その箇所のメンテナンスを捨てるということです。
おまじない程度で済むごく短いコード片であればまだしも、複雑な処理をさせるようなコードはプラグインの形にして、中のコードを見ずに使える部品にしてあげるのが望ましいと考えています。
 
トップ