【解決済み】イベント名で検索するスクリプト

akira57
記事: 34
登録日時: 2020年1月10日(金) 22:38

【解決済み】イベント名で検索するスクリプト

投稿記事by akira57 » 2022年9月16日(金) 21:41

 以下のように、あるマップ内に4つのイベントがあるとします。
イベント名「EV①」を検索して、その各イベントのセルフスイッチAをオンにするスクリプトを以下のように作成しました。この例だと、001と002の2つのイベントのセルフスイッチAをオンにすることになります。
しかし、実行するとエラーになります。おそらく004のイベントが無いため、i=4のところでエラーになると思われます。
 そこで、i=4のときつまりそのイベント番号が無いときはスルーして、エラーにならずに検索していく方法、スクリプトを教えて頂けないでしょうか。

【イベント4つ】
001 EV①
002 EV①
003 EV②
005 EV②

【スクリプト】
for(var i = 1; i <= 5; i++){
$gameVariables.setValue(1,$dataMap.events[i].name)
if($gameVariables.value(1).match(/EV①/)){
$gameSelfSwitches.setValue([this._mapId, i, "A"], true)
}
}
最後に編集したユーザー akira57 on 2022年9月19日(月) 21:47 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: イベント名で検索するスクリプト

投稿記事by Plasma Dark » 2022年9月17日(土) 04:55

プレイヤーが今いるマップ上のイベントから、イベント名が EV1 であるようなイベントのセルフスイッチAをONにするスクリプトは、以下のように書けます。

コード: 全て選択

  $gameMap.events()
    .filter(gameEvent => gameEvent.event().name === "EV1")
    .forEach(gameEvent => $gameSelfSwitches.setValue([this._mapId, gameEvent.eventId(), "A"], true));


プレイヤーが今いるマップの情報を取得したい場合、 $dataMap を直接参照するより、 $gameMap を参照するほうが便利なケースが多いです。
$dataMap はマップデータのjsonをロードしたオブジェクトであるのに対し、 $gameMap はそれを参照してゲーム中のマップ情報を扱いやすくした、 Game_Map クラスのインスタンスです。
$gameMap.events() は、プレイヤーが今いるマップのイベントすべてを、 Game_Event クラスインスタンスの配列として返します。
この配列に、定義されていないイベント(akira57さんの例にあるID4のイベント)は含まれません。

jsの配列には .filter メソッドが定義されており、引数として渡した関数が真を返す要素のみに絞り込んだ新しい配列を返します。
Game_Event クラスに定義された .event メソッドは、そのイベントの元データとなる $dataMap.events[イベントID] のオブジェクトを返します。
つまり、2行目では、プレイヤーが今いるマップのイベントすべてを含む配列から、名前が EV1 であるようなイベントのみに絞り込んでいます。
更にその配列の中身すべてに対して、 .forEach メソッドで、引数で渡した関数の処理(セルフスイッチAをONにする)を行います。

Array.prototype.filter - MDN
Array.prototype.forEach - MDN

配列を操作するメソッドは便利で、多くの場合for文より簡潔に書けるので、ぜひ使ってみてください。
akira57
記事: 34
登録日時: 2020年1月10日(金) 22:38

Re: イベント名で検索するスクリプト

投稿記事by akira57 » 2022年9月19日(月) 09:45

「イベント名で検索する」スクリプトについて方法教えて頂きありがとうございました。
さらに、もう1つ教えていただけないでしょうか。
「イベント名の一部一致するものを検索する」スクリプトだとどう書けるのでしょうか。例えば、

 001 EV1(あ)
 002 EV1(い)
 003 EV2(あ)
 004 EV2(い)

の4つのイベントのうち、文字「EV1」を含むイベント名であるイベントを検索したい、つまりこの場合、
001 と 002 の2つのイベントを検索する方法は、Plasma Dark様が教えて下さった

$gameMap.events()
.filter(gameEvent => gameEvent.event().name === "EV1")
.forEach(gameEvent => $gameSelfSwitches.setValue([this._mapId, gameEvent.eventId(), "A"], true));

の2行目を
 gameEvent.event().name === "EV1"  の箇所を  gameEvent.event().name.match(/EV1/)
に変更すればよいかと思ったのですが、エラーとなってしまいました。
よろしくお願いいたします。
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: イベント名で検索するスクリプト

投稿記事by Plasma Dark » 2022年9月19日(月) 15:10

エラーが出たら、エラーメッセージを読んで下さい。
部分一致についてはおっしゃる通り、正規表現を使った判定で動くように思います。

MDNによれば、 RegExp.test() を用いることが推奨されていますね。

RegExp.prototype.test() - MDN

前方一致で良ければ /^EV1/.test(対象文字列) で判定が可能です。

コード: 全て選択

$gameMap.events()
  .filter(gameEvent => /^EV1/.test(gameEvent.event().name))
  .forEach(gameEvent => $gameSelfSwitches.setValue([this._mapId, gameEvent.eventId(), "A"], true));
akira57
記事: 34
登録日時: 2020年1月10日(金) 22:38

Re: イベント名で検索するスクリプト

投稿記事by akira57 » 2022年9月19日(月) 21:46

ご教授いただいた方法で実行したところ、上手くいきました。
大変ありがとうございました。
 MZにて長編作成中で、各マップのデータが大量になってきて、効率よく管理できないか考えていたところでした。
イベント名で「敵」を含むもの(部分一致)を検索して、マップ上の敵イベントのセルフスイッチAをいっせいにオンにする、みたいなことができるとよいなと思っていたので、
希望が叶い感謝申し上げます。
 今後も様々なスクリプト作成のために、少しずつ勉強していこうと思っています。
ありがとうございました。

“MZ:質問” へ戻る