【解決済み】SAN_AnalogMoveの'posNt'エラーの原因は?

返信する
rpgcode
記事: 47
登録日時: 2020年2月29日(土) 03:53

【解決済み】SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by rpgcode »

プラグインのSAN_AnalogMoveを使っています。
バージョンは3.1.5です。

時々、

TypeError
Cannot read property 'posNt' of undefined

と、エラー表示されるのですが原因がわかりません。

原因や対処策わかる方いたら教えて欲しいです。
よろしくお願いします。
添付ファイル
posNt_Error.png
最後に編集したユーザー rpgcode [ 2021年5月29日(土) 21:28 ], 累計 3 回
rpgcode
記事: 47
登録日時: 2020年2月29日(土) 03:53

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by rpgcode »

その後、調べているのですが、未だ原因がわかりません。

AnalogMoveのコードを見ると以下の部分だと思いますが、

コード: 全て選択

// 無視イベントIDリストの更新
Game_Player.prototype.updateIgnoringEventIds = function() {
    this._ignoringEventIds = this._ignoringEventIds.filter(
        function(eventId) {
            var event = $gameMap.event(eventId);
            return event.posNt(this._x, this._y);
        }, this
    );
};
event.posNt の部分で落ちるということはイベントの取得が正常にできていないのでしょうか……
このメソッドは何をやっているのですか?

更に調べてみたところ、エラーが発生するのはプレイヤーがイベントに接触した時で、プレイヤーにあたるイベントのプライオリティを「通常キャラの下」か「通常キャラの上」にすると、上記エラーが確実に発生することがわかりました。

▼エラーが発生しない
プライオリティ:通常キャラと同じ
   トリガー:プレイヤーから接触

▼エラーが発生する
プライオリティ:通常キャラの下 or 通常キャラの上
   トリガー:プレイヤーから接触

プライオリティの理解が不足しているのですが、ここを変えるとなぜこのエラーが発生するのでしょうか?
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by Plasma Dark »

プラグインのSAN_AnalogMoveを使っています。
まず、問題になっていると思われるプラグインについては、入手元へのリンクを貼るようにすると回答者に対して親切ですので、次から意識してみてください。
https://github.com/rev2nym/SAN_AnalogMo ... logMove.js
このメソッドは何をやっているのですか?
アナログムーブプラグインは、1ドットずつの移動を実現するプラグインです。
しかし、ツクールMVは1マスずつ移動することを前提に作られており、単に1ドットずつ移動するようにしただけでは、接触をトリガーにするイベントが移動するたびに起動してしまいます。
一度の接触で一度だけイベントを起動するという仕様にするため、プレイヤーが接触トリガーのイベントに重なったときに、 Game_Player に _ignoringEventIds という、起動トリガーを無視するイベントID一覧を記録するようになっています。

updateIgnoringEventIds メソッドは、このイベントID一覧を更新しています。
プライオリティの理解が不足しているのですが、ここを変えるとなぜこのエラーが発生するのでしょうか?
プレイヤーと接触トリガーで起動するイベントが重なっている(かつ、すり抜けフラグOFFの)場合に、対象イベントを _ignoringEventIds に追加するためです。
プライオリティがプレイヤーと同じ場合、すり抜けがONになっていないと重ならないので、このIDリストに追加されません。

さて、肝心のエラーの原因ですが、もしかしてマップ上のイベントを操作するようなプラグイン、例えば EventReSpawn.js を利用していないでしょうか。
https://github.com/triacontane/RPGMaker ... ReSpawn.js

エラーを吐いている箇所では、 _ignoringEventIds からプレイヤーと重なっていないイベントのIDを取り除く処理になっており、重なっていた各イベントIDについて、プレイヤーのいるマスにまだ存在するかどうかを判定します。

マップ上に存在するイベントを、イベントID指定で取得するための $gameMap.event(eventId) でundefined が返されているのですが、これは本来であれば異常事態で、他にプラグインのない状態では起こりません。

EventReSpawn.js はイベントを動的に生成してIDを割り振ります。
そして、イベントの一時削除により、動的に生成したイベントを完全に削除します。
接触トリガーかつプライオリティがプレイヤーと異なるイベントを生成し、接触時のイベントで削除した場合、 _ignoringEventIds の更新時にイベントを取得できず、エラーになります。
rpgcode
記事: 47
登録日時: 2020年2月29日(土) 03:53

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by rpgcode »

Plasma Darkさん、いつもありがとうございます。

まさに仰るとおりでいろいろ切り分けたところ、SAN_AnalogMoveとEventReSpawnを使っている時にエラーが発生することがわかりました。
下記に検証用プロジェクトを作りました。

 https://firestorage.jp/download/34e28d0 ... 27ae8fb3b0

起動すると宝箱が3つ表示されます。

■左の赤い宝箱
テンプレートプラグインのみを使って生成しているものです。
エラーは発生しません。宝箱は消去されます。

■真ん中の黄色宝箱
赤い宝箱と同じイベントを単純設置しているものです。
エラーは発生しません。宝箱は消去されます。

■右の赤い宝箱
TemplateEventプラグインとEventReSpawnを使って「宝箱A」を設置しています。
「TypeError: Cannot read property 'posNt' of undefined」エラーが発生します。

イベントテンプレートの宝箱A実行内容の「イベントの一時消去」をなくすとエラーがなくなります。

このような状況なのですが解決策ありませんでしょうか。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by Plasma Dark »

このような状況なのですが解決策ありませんでしょうか。
SAN_AnalogMove.js に対して修正がかけられれば一番良いのですが、メンテナのサンシロさんはすでに活動されていないようなので、誰かがメンテナンスを引き継ぐのが望ましいです。
しかし、規模の大きいプラグインですので、これを引き受けたがる人はなかなかいない気がしますね。私も嫌です。

もう少し楽な方法としては、 updateIgnoringEventIds だけ上書きするパッチプラグインを作ってしまうのが手っ取り早い気はします。

コード: 全て選択

(function () {
  'use strict';

  Game_Player.prototype.updateIgnoringEventIds = function () {
    this._ignoringEventIds = this._ignoringEventIds.filter(eventId => {
      const event = $gameMap.event(eventId);
      return !event || event.posNt(this._x, this._y);
    });
  };
})();
rpgcode
記事: 47
登録日時: 2020年2月29日(土) 03:53

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by rpgcode »

Plasma Darkさん

ありがとうございます。

エラーが出なくなったことを確認しました!
プラグイン開発者さんやメンテナンスをされている方には本当に頭が下がる思いです。

こちらのパッチプラグイン使わせて頂きたいのですが、ライセンスはどうすればいいでしょうか?
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by Plasma Dark »

こちらのパッチプラグイン使わせて頂きたいのですが、ライセンスはどうすればいいでしょうか?
特に考えていませんでした。強いて言えばCC0ですね。ご自由にお使いください。
rpgcode
記事: 47
登録日時: 2020年2月29日(土) 03:53

Re: SAN_AnalogMoveの'posNt'エラーの原因は?

投稿記事 by rpgcode »

Plasma Darkさん

ありがとうございます。
では、そのように使わせていただきます。

頂いたアドバイスや解説、本当にためになります。
すべて理解できているわけではないのですが、読み返し徐々にでも理解できるよう努めていきたいと思います。

おかげさまでとても助かりました。
いつもながらありがとうございました。

こちらのスレッドは解決済みとします。
返信する

“MV:質問”に戻る