ページ 11

【解決済み】プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月26日(火) 22:15
by 論理イヌ
プラグインで生成したイベントを一時消去したのですが、
透明のイベントが残っている? ようです。
完全に削除したいのですが、アドバイスをいただけないでしょうか。

トリアコンタンさんの下記2つのプラグインを使っています。
・テンプレートイベントプラグイン
・イベント動的生成プラグイン

イベントを生成して、スクリプトで一時消去した後、
すぐにイベントがあった場所の座標のイベントIDを調べると、
生成したスクリプトのIDが取得できます。

一時消去してイベントIDを取得できないようにしたいのですが、
アドバイスいただけないでしょうか。

なお、こちらが削除のスクリプトです。
マップ上の全てのイベントをforEachで回し、
生成元のテンプレートイベントのメモ欄に「生成イベント」と設定してあるので、
そのイベントをif文で判定して消しています。

$gameMap.events().forEach(
function(event){
if(event.event().note==='生成イベント'){
event.erase();
}
}
)

Re: プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月27日(水) 15:32
by 冷やっこ
こんにちは。

以前私も同プラグインを使用した時に似たような事を行ってその時に見様見真似で書いたスクリプトです。
JavaScriptはまだまだ初心者ですので無駄な記述等あるかもしれませんがもしご参考になれば…。

コード: 全て選択

var i = 1; var n = 1; var loop = $gameMap.events().length;

while(i <= loop){
if (!!$gameMap.event(n)){
if ($gameMap.event(n).event().note.match(/生成イベント/)){
$gameMap.eraseEvent(n);
}
n++; i++;
}else{
n++
}
}


イベントの一時消去は $gameMap.eraseEvent(n); で行っております。
この方法で一時消去させればイベントは残らない様です。

Re: プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月27日(水) 19:41
by トリアコンタン
こんにちは!
プラグインのご利用ありがとうございます。

すでにご指摘の通り、「$gameMap.eraseEvent(n);」を使うことで消去できます。
動的イベントを消去する際は、マップデータから紐付けを消去する必要があるため、上記スクリプトの実行が必要です。

Re: プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月27日(水) 20:28
by 論理イヌ
>冷やっこさん
こんにちは。
コピーしてぺーしましたところ、無事一時消去することができました!
ありがとうございます!

イベントIDが飛び飛びになっていても対応できるようにしているんですね(たぶん)。
私では絶対思いつかない方法なので、解決するスクリプトをそのまま貼っていただけて嬉しいです。


>トリアコンタンさん
プラグイン製作者の方からお墨付きをいただけたので、安心してこのスクリプトを組み込むことができます。
返信ありがとうございました。

トリアコンタンさんのプラグインにいつも救われています。
やりたいことが簡単にできるようになるので、ゲーム作りが楽しくできて嬉しいです。
様々なリファレンスなども書いていただけて、本当に助かっております。
ありがとうございます。

Re: 【解決済み】プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月27日(水) 21:31
by Plasma Dark
ループにindex変数を用いるトラディッショナルな書き方は、可読性を著しく損ないメンテナンスできないコードになるので、そこを気にするなら配列操作関数を用いたほうが良いです。

コード: 全て選択

$gameMap.events()
  .filter(gameEvent => gameEvent.event().note === '生成イベント')
  .forEach(gameEvent => $gameMap.eraseEvent(gameEvent.eventId()));

(1.6系でのみ動くコード例です。1.5系の場合は=>が使えないので適宜書き換えてください)

完全一致なら正規表現マッチを用いる必要すらないので、上記コードでは===で比較しています。

もし部分一致で判定したい場合は、

コード: 全て選択

/生成イベント/.test(gameEvent.event().note)

などと置き換えてしまっても構いません。
マッチしたか否かさえわかれば良いので、booleanを返す RegExp.prototype.test 関数のほうが String.prototype.match 関数よりもシンプルかつ高速です。

Re: 【解決済み】プラグインで生成したイベントをスクリプトで一時消去できない

Posted: 2020年5月27日(水) 22:11
by 論理イヌ
Plasma Darkさん

教えていただいたコードにしたところ、もちろんこちらも動きました。
可読性は大切ですよね。
冷やっこさんの書いていただいたものも大変ありがたかったのですが、
ネストが深かったりindexが2つあると、やっぱり解読に手間取ります。
(批判しているわけではないです!
 解決策のコードを書いていただけで、本当にほっとしましたし、嬉しかったです。)

こんな綺麗なコードを教えてくださりありがとうございます。
おかげで未来のテスト工程中の私も喜んでいると思います。


ところで、index変数でのループはすでにトラディッショナルなんですね……。
5年前くらいから知識を更新していないので、教えていただけて本当に助かりました。

配列操作関数を少し見てきました。アロー関数なるものがあるんですね。
PHPのフレームワークみたいです。わかりやすい……こんなものがあるのか……。
私はたぶん石器時代に生きています。文明の開化は遠い。

ツクールを作るようになって、新しい知識を得ていく喜びを思い出してきました。
いろいろ教えていただけて嬉しいです。これからもがんばろう。