【解決済】敵シンボルを消すアイテムの作り方

gitoge
記事: 3
登録日時: 2022年7月31日(日) 18:14

【解決済】敵シンボルを消すアイテムの作り方

投稿記事by gitoge » 2022年8月03日(水) 17:37

件名のアイテムを作ってみたのですが、より良い方法を探しています。

条件:
・シンボルエンカウントのRPG
・消したいのは同一マップ上のザコ敵すべて
・ここで言う「消す」は、敵が見えず触れず、戦闘が発生しないこと
・アイテムはマップ上ならどこでも使用可
(敵が出るマップでのみ使えるのが理想だが、こだわらない)
・消した敵はマップ移動で復活

現状、初心者の私が設計すると次のようになります。

 1. アイテム使用で特定のスイッチON
 2. イベント出現条件がスイッチONのとき、空白のイベントページで敵シンボル消去
 3. マップ移動でスイッチOFF

これはこれで機能するのですが、各マップでスイッチを初期化する必要があり
多分もっと良い方法があるんだろうなーと思い質問させていただきました。

皆さんでしたらどのように作るか、アドバイスをいただければ幸いです。


---ここから余談---

上記の方法に引き続き、他にも試したことがありまして

 1. アイテム使用で特定のスイッチON、ウェイトを挟んでスイッチOFF
 2. イベント出現条件がスイッチONのとき、空白のイベントページで敵シンボル消去
 3. 2のイベントページに「イベント処理の中断」または『イベントの一時消去』

とすることで目的の挙動にならないかと思ったのですが、無理でした。
(一度消えた敵がウェイト時間後、しれっと出現する)

マップ移動を挟まない限りイベントが存在しないかのように
一切の処理を行わなくする方法は何かありますでしょうか?
最後に編集したユーザー gitoge on 2022年8月05日(金) 21:35 [ 編集 1 回目 ]

名無し蛙
記事: 206
登録日時: 2015年11月23日(月) 02:46

Re: 敵シンボルを消すアイテムの作り方

投稿記事by 名無し蛙 » 2022年8月03日(水) 21:29

まずイベントが敵シンボルか否かを判断するフラグが必要です。
MVならメモ欄に<enemy>と記入する事でスクリプト上では
event.event().meta['enemy']で判定する事が出来るようになります。
そして「イベントの一時消去」に該当するスクリプトコードはevent.erase()です。

この二つの情報とfilter,forEachを組み合わせるとイベントコマンド>スクリプトから
以下のコードを実行する事で目的を果たす事が出来ると思います。

コード: 全て選択

$gameMap.events()
    .filter(e => e.event().meta['enemy'])
    .forEach(e => e.erase());

現マップ($gameMap)の全てのイベント(.events())から
メモ欄に<enemy>の記述があるものを抽出し(.filter(e => e.event().meta['enemy'])
(条件にヒットした)全てのイベントのeraseメソッドを実行する(.forEach(e => e.erase())
という意味になります。

gitoge さんが書きました:・アイテムはマップ上ならどこでも使用可
(敵が出るマップでのみ使えるのが理想だが、こだわらない)

ついでにこっちも答えておくと条件分岐の4頁目、スクリプトから

コード: 全て選択

$gameMap.events().some(e => e.event().meta['enemy']);

これで現マップの全てのイベント($gameMap.events())の中から
一つでも<enemy>タグがあるイベントが存在する場合、真を返す(.some(e => e.event().meta['enemy'])
というコードになります。
gitoge
記事: 3
登録日時: 2022年7月31日(日) 18:14

Re: 敵シンボルを消すアイテムの作り方

投稿記事by gitoge » 2022年8月04日(木) 07:48

> 名無し蛙 さま

ご回答ありがとうございます!
スクリプトに手を出すのはまだまだ先のことと思っていましたが
教えていただいたコードで無事、目的の挙動となりました。

ちょっと感動したのと欲が出てきたので、自分でも調べてみました。
参考:
http://www.rpgmaker-script-wiki.xyz/get ... ion_mv.php
(イベントの設定情報の取得 / ツクールMVスクリプトリファレンスwiki)

教えていただいたコード内の、enemyタグを判定する箇所に代えて
「特定の画像名(例:Monster)が使われているか」で敵シンボルのみをフィルターできれば
全ての処理をアイテム側で完結できて良さそう!と思ったのですが
調べたり試したりしていると、みるみる時間が溶けていきますね。。。

自分でも引き続き調べるつもりではありますが
もし可能であれば、どう記述すればよいものか教えていただけると助かります。

取り急ぎお礼まで。
名無し蛙
記事: 206
登録日時: 2015年11月23日(月) 02:46

Re: 敵シンボルを消すアイテムの作り方

投稿記事by 名無し蛙 » 2022年8月04日(木) 21:54

説明が少し難しいですね。
event.event().meta['enemy']とeventを二回書いてる事に違和感あると思いますがeventには二種類あります。
一つはゲーム中に変動するデータを管理するもの。(Game_Event)
もう一つはゲーム中に変動しないデータ、つまりエディタで設定したデータを収めたもの。(RPG.Event)
主に$gameXXXXと$gameが接頭につくものは前者、$dataXXXXと$dataが接頭につくものは後者です。

event.event()の先のeventは動的データを管理しているeventの事で
後の.event()はそれに紐づけられた静的なeventを呼び出す、という意味になります。
これはeventの他にもactor、enemy、map等にもあるので混同しないように注意してください。

それでツクールエディタで設定した情報なので当然、静的なeventから取得する事が出来ます。
が、アクセスする方法が少々長いです。
event.event().pages[0].image.characterNameと書く事で
ページ1(.pages[0])の画像情報(.image)の中のキャラクタファイル名(.characterName)を取得出来ます。
これとは別に動的なeventの方にも現在表示中のキャラクタファイル名を取得する
メソッドがあるので基本的にそちらを利用した方が良いでしょう。
event.characterName()
差し替えるならこんな感じですか。

コード: 全て選択

$gameMap.events()
    .filter(e => e.characterName().includes("Monster"))
    .forEach(e => e.erase());

.includesは文字列の中に指定の文字列があるか検索するメソッドです。
このテの情報は慣れたらrpg_objects.jsを直接読解出来るんですけど
読解した情報をリファレンスに纏めてくださってる方もいるので気になるなら活用しましょう。

https://katai5plate.github.io/RPGMV-CoreScript-Reference/
gitoge
記事: 3
登録日時: 2022年7月31日(日) 18:14

Re: 敵シンボルを消すアイテムの作り方

投稿記事by gitoge » 2022年8月05日(金) 21:35

>名無し蛙 さま

再びご回答ありがとうございます!
私にも分かるような解説をしていただき、とても助かっております。

書いていただいたコードが、求めていたそのものだったので
今回はそのまま使わせていただこうと思います。
リファレンスもあることですし、いつかは独力で書けるようになりたいですね。

ともあれ本トピックはこれで解決済みとさせていただきます。
ここまでお付き合いいただき、本当にありがとうございました。

“MV:質問” へ戻る