すいません。
スクリプトの記述について質問をさせてください。
自分の位置より上方向にあるイベントを取得する以下のスクリプトについて
const targetEvent = $gameMap.events()
.filter(event => event.x === $gamePlayer.x && event.y < $gamePlayer.y)
.reduce((result, event) => !result || result.y < event.y ? event : result, undefined);
2行目のfilterで「イベント名に'対象外'という文字が含まれているものを除く」
という条件を加えたいのですがどのように記述すればいいのでしょうか?
自分なりに$gameMap.events()の下を探してみたのですが
イベント名らしい項目を見つけることができませんでした。
よろしければ、どのように記述するかを教えていただけないでしょうか。
以上、よろしくお願いいたします。
【解決済】filterでの絞り込みについて
Re: filterでの絞り込みについて
すいません!
以下のように記述し、試してみたところできました。
const targetEvent = $gameMap.events()
.filter(event => event.x === $gamePlayer.x && event.y < $gamePlayer.y && !$gameMap._events[event._eventId].event().name.includes("対象外"))
.reduce((result, event) => !result || result.y < event.y ? event : result, undefined);
ID指定しないといけないやり方は使えないだろうという先入観で試しておらず、
いざやってみたところうまく動きました。
私の確認不足でした。
お騒がせして申し訳ありませんでした。
以下のように記述し、試してみたところできました。
const targetEvent = $gameMap.events()
.filter(event => event.x === $gamePlayer.x && event.y < $gamePlayer.y && !$gameMap._events[event._eventId].event().name.includes("対象外"))
.reduce((result, event) => !result || result.y < event.y ? event : result, undefined);
ID指定しないといけないやり方は使えないだろうという先入観で試しておらず、
いざやってみたところうまく動きました。
私の確認不足でした。
お騒がせして申し訳ありませんでした。
- Plasma Dark
- 記事: 676
- 登録日時: 2020年2月08日(土) 02:29
- 連絡を取る:
Re: 【解決済】filterでの絞り込みについて
コードを記述する際は、専用のタグを用いると多少見やすくなるので、活用してみてください。
(書き込みフォーム上部の Code ボタンから挿入できます)
自己解決されたようですが、補足します。
rmmz_objects.js にあるGame_Map, Game_Eventクラスの記述を読んでみてください。
$gameMap.events()関数は、そのマップ上にあるイベントの状態を表すGame_Eventインスタンスの配列を返します。
つまり、filter関数に渡すコールバックの引数eventはGame_Eventインスタンスになります。
$dataMap.events配列には現在いるマップのイベント定義が格納されていて、イベントIDを添え字にしてそれぞれのイベント定義にアクセスすることができます。
Game_Eventクラスのevent関数では、そのイベントの状態を作る元となったイベントの定義を取得することができます。
つまり、 Game_Eventインスタンスが取得できていれば、コード中でイベントIDを意識する必要はありません。
$gameMap._events[event._eventId]はそのままeventに置き換えても良い、ということです。
探す対象のイベントは
- プレイヤーキャラクターと同じX座標にいる
- プレイヤーキャラクターよりも上にいる
- イベント名に「対象外」文字列を含まない
これらの条件を満たすイベントのうち、最も下にいるものでしょうか。
そうであればこのように書けます。
コールバックの引数シンボル名は、Game_EventインスタンスであることがわかりやすいようにgameEventにリネームしていますが、読んで理解できるならeventのままでも問題ありません。
(書き込みフォーム上部の Code ボタンから挿入できます)
自己解決されたようですが、補足します。
rmmz_objects.js にあるGame_Map, Game_Eventクラスの記述を読んでみてください。
$gameMap.events()関数は、そのマップ上にあるイベントの状態を表すGame_Eventインスタンスの配列を返します。
つまり、filter関数に渡すコールバックの引数eventはGame_Eventインスタンスになります。
$dataMap.events配列には現在いるマップのイベント定義が格納されていて、イベントIDを添え字にしてそれぞれのイベント定義にアクセスすることができます。
Game_Eventクラスのevent関数では、そのイベントの状態を作る元となったイベントの定義を取得することができます。
つまり、 Game_Eventインスタンスが取得できていれば、コード中でイベントIDを意識する必要はありません。
$gameMap._events[event._eventId]はそのままeventに置き換えても良い、ということです。
探す対象のイベントは
- プレイヤーキャラクターと同じX座標にいる
- プレイヤーキャラクターよりも上にいる
- イベント名に「対象外」文字列を含まない
これらの条件を満たすイベントのうち、最も下にいるものでしょうか。
そうであればこのように書けます。
コード: 全て選択
const targetEvent = $gameMap.events()
.filter(gameEvent =>
gameEvent.x === $gamePlayer.x
&& gameEvent.y < $gamePlayer.y
&& !gameEvent.event().name.includes("対象外")
)
.reduce((result, gameEvent) => !result || result.y < gameEvent.y ? gameEvent : result, undefined);
コールバックの引数シンボル名は、Game_EventインスタンスであることがわかりやすいようにgameEventにリネームしていますが、読んで理解できるならeventのままでも問題ありません。
Re: 【解決済】filterでの絞り込みについて
Plasma Dark様
丁寧にご説明をいただき、ありがとうございました。
思えば元ファイルのほうを見ることはしておりませんでした。
いただいた説明を見ながらファイル内の記述を読んでみて
完全ではないですが、受け渡しの流れを理解する事が出来ました。
非常にわかりやすく書いていただき、助かりました。
スクリプトの記述もこちらのやり方に変えたいと思います。
また、掲示板の機能についても教えていただきありがとうございました。
次の機会がありましたら活用させていただきたいと思います。
丁寧にご説明をいただき、ありがとうございました。
思えば元ファイルのほうを見ることはしておりませんでした。
いただいた説明を見ながらファイル内の記述を読んでみて
完全ではないですが、受け渡しの流れを理解する事が出来ました。
非常にわかりやすく書いていただき、助かりました。
スクリプトの記述もこちらのやり方に変えたいと思います。
また、掲示板の機能についても教えていただきありがとうございました。
次の機会がありましたら活用させていただきたいと思います。