ページ 11

【解決済み】「イベントの一時消去」を実行したイベントの判定

Posted: 2021年5月06日(木) 19:15
by MEIKOI
こんにちは。いつもお世話になってます。

イベントに対して、一時消去されたイベントか?の判定を行いたいのですが
上手くいきません。

具体的に作っている動作は、

1,マップ上に複数のイベントを配置。※イベントのメモ欄に[りんご]と記述
2,配置した全てのイベントを一時消去。
3,イベントがすべて消去されている時は、文章「りんごがありません」を表示する。

↓3に各当する部分のコード

コード: 全て選択

var check = 0;
for (var i = 0; i < $gameMap.events().length; i++)

if (~$dataMap.events[$gameMap.events()[i]._eventId].note.indexOf("[りんご]")
&& $gameMap.event($gameMap.events()[i]._eventId)._erased == false)
{check += 1}
}
if ( check == 0){$gameMessage.add("りんごがありません")}
if ( check >= 1){$gameMessage.add("りんごがあります")}



一時消去したイベントは、配列から削除されると思っていたのですが
どうも削除されてない??ようなので ._erasedの判定を加えてみたのですが
checkの値は、0になってくれません。

何か気が付いた点がありましたら、教えてください。
よろしくお願いします。

Re: 「イベントの一時消去」を実行したイベントの判定

Posted: 2021年5月06日(木) 20:10
by 奏ねこま
checkを+1してるイベントがどれなのか調べたら何かわかるんじゃないでしょうか?

Re: 「イベントの一時消去」を実行したイベントの判定

Posted: 2021年5月06日(木) 20:15
by 名無し蛙
こんにちは
自分の環境で試しにコードコピペしましたが問題無く反映されましたね
適当なイベントに[りんご]と書き、
スクリプトコード→一次消去→スクリプトコードのみのシンプルな確認ですが
りんごがあります
りんごがありません
と表示されました。何か他の要素で競合している可能性があります

それとは別に余計なお節介ですがリファクタリング(機能そのままで最適化)したくなるコードですねぇ
①ツクールMVのメモ欄では<りんご>と書く事で.meta['りんご']にtrueが格納されるのでmetaを活用した方が良いです。
②イベントデータを取得する場合は$dataMapからではなく、Game_Event.prototype.eventから取得した方が良いです。
③配列にアクセスする時はforを使うよりもforEach系のメソッドを使用した方が良いです。
someメソッドは「一つでも条件を満たす場合はtrueを返す」という代物なので今回は特に有効です。
アロー関数と組み合わせるとなお良い。

コード: 全て選択

const result = $gameMap.events().some(e => e.event().meta['りんご'] && !e._erased);
const text = result ? "りんごがあります" : "りんごがありません";
$gameMessage.add(text);
this.setWaitMode('message');

Re: 「イベントの一時消去」を実行したイベントの判定

Posted: 2021年5月06日(木) 22:45
by MEIKOI
アドバイスいただきありがとうございますm(_ _)m

動作テストして頂き、動くとの事でしたので
再度隅々チェックしてみたところ
イベントの一時消去した後に
セルフスイッチがコモンイベントから操作されていたので
削除しましたら問題なく動きました。

プログラミングに関しては、赤子の様に疎いので
someについてググり簡単な記述に関しては軽く理解しました。
イベントコマンドのスクリプト欄は少ないのでそれも含め大変ありがたいです!
metaを使うかまだ悩んでいるのですが、結構作ってる中でnoteOfを使っちゃっているので
イベントのメモ欄含めて書き換えも大変だなと感じているので、また精査してみます。

今回の悩みは解決いたしました。
ありがとうございました!