【解決済み】hzStartEventに範囲追加したらエラーの原因がわからなくなりました

アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

【解決済み】hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by にゃたま » 2017年4月17日(月) 18:22

hiz様制作のhzStartEventに範囲を指定できる機能を追加したのですが複数のイベントで
同時にプラグインコマンドを使用した時にかなりの確率で
Cannot read property 'list' of undefinedというエラーになってしまいます。
尚、イベント同士がお互いが範囲指定した範囲に入るくらい近い位置で同時に起動すると発生します。
トリアコンタン様の動的発生プラグイン及びテンプレートプラグインで複数同時に発生させていますが
これを複数同時にイベント起動させてもエラーにならないようにしたいです。
ちなみにzoneによる範囲指定を行ったときのみ発生するようです。
原因が解る方いますでしょうか?
スクリプトの知識の浅い者が作ったので細かな動作までは掴みきれませんでした。
範囲指定はfor文のみでループさせた単純なものです。
ソースを添付致しますので修正していただけますと助かります。よろしくお願いいたします。
添付ファイル
NYA_StartEvent.js
(6.35 KiB) ダウンロード数: 3 回
最後に編集したユーザー にゃたま on 2017年4月18日(火) 11:57 [ 編集 3 回目 ]

アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by しぐれん » 2017年4月17日(月) 18:43

添付ファイルのプラグインを確認したところ、それらしきエラーは見つかりませんでした。
(.listで検索したが、存在しなかった)

そのため、エラー自体は他のプラグインの内部で発生していると考えられます。
エラーが発生した瞬間にF8を押すことでスタックトレースというプラグインの呼び出し履歴が得られます。
それがないと原因を特定しづらいです。
プラグインのエラー報告は以下を参考に。
http://qiita.com/triacontane/items/2e227e5b5ce9503a2c30
現在、プラグイン依頼はお休み中です。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by にゃたま » 2017年4月17日(月) 21:45

しぐれん様
しぐれん さんが書きました:エラーが発生した瞬間にF8を押すことでスタックトレースというプラグインの呼び出し履歴が得られます。
それがないと原因を特定しづらいです。
プラグインのエラー報告は以下を参考に。
http://qiita.com/triacontane/items/2e227e5b5ce9503a2c30


こんばんは。ご連絡いただきありがとうございます。
どのようなシーンで発生するかというとyoutubeで公開した製作中ゲームの動画を参考にすればわかりますが
このドラゴンが吐く炎をトリアコンタン様の動的発生プラグインで発生させた際に
炎の玉それぞれに範囲2でstartevent設定してあります。
プラグインはイベントで必ず必要なものに限定して実行しているもののやはりエラーになります。
因みに発生条件がよくわかりません。ただ動的発生プラグイン併用時にはよく発生するようです。
スタックトレースではソースコードの最後のevent.start();のところで発生しているようです。
https://youtu.be/Uh6ZM8d8Lj8
添付ファイル
スクリーンショット 2017-04-17 21.25.57.png
アバター
しぐれん
記事: 973
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by しぐれん » 2017年4月17日(月) 23:16

動画あると分かりやすいですね。
一つ質問しますが、起動から全く同じ操作をした場合、エラーの発生するタイミングは同一ですか?


start()は呼び出しに成功しているので、list()の呼び出しが失敗しているとは考えづらいです。
list()内部のpage()で失敗している可能性が考えられます。
_pageIndex周辺も怪しいです。
ページ更新のリフレッシュタイミングと呼び出しが前後して不安定化しているパターン。
同一イベントの多重起動も否定できません。

eventIDが不適切な数値になっているなど。
Game_Event.prototype.startを再定義して、呼び出し前にconsole.log(this.eventId())あたりで番号をチェックしてみるのが良いと思います。
現在、プラグイン依頼はお休み中です。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by にゃたま » 2017年4月18日(火) 10:06

しぐれん様

お世話になっております。原因がやっとわかってきました。
炎の玉にあるstarteventの範囲内に<SE>タグ(即ちstarteventが有効)のイベントが置かれており
それを「イベントの一時消去」コマンドで完全に消したつもりだったのですが実際はそれが残っている
と認識されておりイベントがなくなっているにもかかわらずイベントの内容が実行されていた
ためのようです。ですので「イベントの一時消去」をなくしたらエラーはなくなりました。

今回聞きたいことはイベントが一時消去されていることを判定するためにどうしたら良いか、なのですが
以下のようにコードにconsole.logを追加してデバッグ画面に出力すると
一時消去されたイベントでもstartevent時にそのイベントのIDが出力されてしまいます。
一時消去時にeventidがnullになっていればこのような問題は起きないのですがnullになってないので
if (event == null) return;をくぐり抜けてしまいエラーになるようです。
一時消去したときにeventidをnullにするにはコアスクリプトをいじるしかないのでしょうか?
それとも何か他に方法はありますでしょうか?
以上です。お返事お待ちしております。

コード: 全て選択

function startEvent(event) {
    if (event == null) return;
    console.log("event.eventId():"+event.eventId());
    event.start();
  }
 
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: hzStartEventに範囲追加したらエラーの原因がわからなくなりました

投稿記事by にゃたま » 2017年4月18日(火) 10:38

しぐれん様

すみません。無事問題解決しました。
以下のコードのように if (event.erased() == true) return;として
erased(即ち一時消去されたイベントならtrue)のときevent.start();を行わないことで
エラーにならなくなりました。しぐれん様ご協力いただきありがとうございました。
本トピックはこれにて解決済みと致します。

コード: 全て選択

/**
   * 指定イベントの起動
   */
  function startEvent(event) {
    if (event == null) return;
    if (event.erased() == true) return; //イベントの一時消去により削除されたイベントを起動しない
    event.start();
  }
   
  Game_Event.prototype.erased = function() {
    return this._erased;
  };

“MV:質問” へ戻る