【解決】【ご協力ありがとうございました】マップ上のすべてのイベントを一時消去したい

返信する
ani
記事: 9
登録日時: 2016年9月25日(日) 12:48

【解決】【ご協力ありがとうございました】マップ上のすべてのイベントを一時消去したい

投稿記事 by ani »

質問させていただきます。


「マップ上のほかのイベントを全て停止させるために、イベントの一時消去で一気に消したい」と思い、
以下のようなスクリプトを組んでみましたが、上手くいきません。

■■■■■

例:
イベントID003のイベントにトリガー:決定ボタン

 ◆スクリプト:for(var i = 0; i <= 100; i++){$gameMap.eraseEvent(i)}

(または

 ◆スクリプト:{$gameMap.eraseEvent(1)}
 ◆スクリプト:{$gameMap.eraseEvent(2)}
 ◆スクリプト:for(var i = 3; i <= 100; i++){$gameMap.eraseEvent(i)}



※ほかの処理※

■■■■■

以上の処理を行わせると、以下のエラーが発生します。

■■■■■
TypeError
Cannot read property 'erase' of undefined
■■■■■


◆スクリプト:{$gameMap.eraseEvent(1)} のみであれば問題なく処理ができることもあわせると、
おそらく繰り返し処理によって存在していない、あるいはすでに消去されているイベントを参照しているために
エラーが起きるのだと思われます。


これをなんとか存在しないイベントをスキップするなりなんなりして、「マップ上の(自分以外の)イベントを全て一時消去する」
スクリプトが作れないでしょうか。
できればプラグインではなく、スクリプト1コマンドでできるようにしたいです。
識者の方、よろしければお知恵をお貸しいただければ幸いです。
最後に編集したユーザー ani [ 2016年9月27日(火) 21:58 ], 累計 1 回
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by 奏ねこま »

こんな感じで。

$gameMap.events().forEach(function(event){ event.erase() })

追記1:
すいません。これだと「自分以外の」ではなく「すべての」ですね。

追記2:自分以外を消す
$gameMap.events().forEach(function(event){ if (event.eventId() != this._eventId) event.erase() }, this)
ani
記事: 9
登録日時: 2016年9月25日(日) 12:48

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by ani »

早速の返信ありがとうございます。
おかげさまで無事エラーを吐くこともなく、自分以外の全てのイベントを一時消去できるようになりました。

が、どうやら自動実行で既に動いているイベントに関しては一時消去だけでは消せず、
おそらくはイベント処理の中断を使わないとそのまま実行されてしまうようです。

なので書いていただいたスクリプトを流用すればいいのだとは思うのですが、上手くいきません。
よろしければお教え願いたいのですが、


■■■■

イベント処理の中断スクリプト
◆this._index = this._list.length

自分以外のすべてのマップ上イベントを一時消去するスクリプト
◆$gameMap.events().forEach(function(event){ if (event.eventId() != this._eventId) event.erase() }, this)


 ●$gameMap.events().
  →()内にイベントIDが代入されていく?

 ●forEach(~)
  →~内を繰り返し

 ●function(event), this
  →?

 ●{if (event.eventId() != this._eventID) event.erase()}
  →もしeventID()が自分のイベントIDではない場合、event.erase()(イベントID()の一時消去)を実行する


■■■■


ということでしょうか。
単純にevent.erase()の部分をイベント処理の中断に変えればよいとも思い

◆$gameMap.events().forEach(function(event){ if (event.eventId() != this._eventId) this._index() = this._list.length() }, this)


と書き換えてみたのですが、どうやら間違いのようです。


重ねての質問ですみませんが、ご教授願えれば幸いです。
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by 奏ねこま »

$gameMap.events()の部分についてはrpg_objects.jsのGame_Map.prototype.events関数を見てください。
forEach文の中身の書き方については「javascript Array.prototype.forEach」などでインターネット検索してください。

自動実行イベントの件は、状況がいまいちわかりません。
自動実行イベントがどういう状態にあるのか、イベント消去のスクリプトはどこから実行されるのか、
具体的な流れの説明をお願いします。
ani
記事: 9
登録日時: 2016年9月25日(日) 12:48

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by ani »

再びのご回答ありがとうございます。

■■■■

$gameMap.events().forEach(function(event){ event.erase() })

$gameMap.events()という配列? 関数? に対し
forEach( )内にある
function(event)という関数を実行しその引数であるevent.erase()を実行する?

$gameMap.events()には
function() {
return this._events.filter(function(event) {
return !!event;
});
という関数が入っており、eventがtrueでない場合trueを返す?

残念ながらしばらく保留にさせてもらいます。

■■■■


自動実行の件ですが、基本的には以下の流れのようにつかうことを想定しています。

■■■■

例:
イベントID001を以下のように設定
並列処理
条件分岐で特定のボタンを押された時に処理を行う:

 例:ピクチャの表示で黒い画像を透明度000で表示
   ピクチャの移動で60フレームかけて透明度255に(ウェイト)
   場所移動

場所移動の直前、または処理の最初に【自分以外全てのイベントの一時消去】を実行


イベントID002~に会話イベント・移動イベントなどを自動実行で設定:

 例:メッセージ表示01
   メッセージ表示02
   メッセージ表示03
   ~
   メッセージ表示20
   ウェイト
   移動ルートの設定

■■■■

このように設定することで、
「会話イベントなどを実行中にプレイヤーが任意のタイミングでボタンを押すことで強制終了し、
 別のイベントを実行する」
という動作を作っております。

上の例で言うと、
「メッセージ表示01~20」の間にイベントID001の動作を起動すると、
場所移動した後でもメッセージ表示の残り~移動ルートの設定が実行されます
(タイミングによってか実行されたりされなかったりまちまち)。
また、場合によっては移動先のマップに配置してある自動実行イベントが起動しなかったりすることもあるようです。
(変数・スイッチを設定しておらず、毎回必ず実行されるタイプのものであっても)
また、【イベントの消去】スクリプトは場所移動コマンドの前であればどこに配置しても同じような結果をもたらす模様です。

そのため、「イベントの一時消去を実行しても、すでに実行されている自動実行の内容は継続して
実行されてしまう」のではないかと思われます。
対処法として、上で述べましたとおり『ID001番に、イベントの消去コマンドを実行させる前にイベント処理の中断コマンドを
挟ませてはどうか』との考えにいたりました。
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by 奏ねこま »

「イベントの中断」コマンドは、そのコマンドを呼び出したイベントの実行を中断するもので
他で実行されているイベントまでは中断できないので…

とりあえず目の前の目的を達成することだけを考えた場合、

コード: 全て選択

$gameMap.events().forEach(function(event){ if(event.eventId() != this._eventId) event.erase() }, this)
$gameMap._interpreter._index = $gameMap._interpreter._list.length
これでできるのではないかと思います。
並列処理やコモンイベントの呼び出しが絡むと少々面倒なこともあるので、
どんな場面でもこのスクリプトで解決できるかはわかりません。
ani
記事: 9
登録日時: 2016年9月25日(日) 12:48

Re: マップ上のすべてのイベントを一時消去したい

投稿記事 by ani »

重ねての回答、ありがとうございます。
教えていただいた二つのスクリプトを使い、なんとかおおむね想定どおりのイベントを組むことができました。
どうもマップに自動実行イベントが1Pしかない場合だと後者がエラーを吐くので、前者と使い分けることで
うまく組み込むことができました。

お付き合いいただき誠にありがとうございました。
返信する

“MV:質問”に戻る