ページ 1 / 1
【解決済み】SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月20日(木) 17:03
by rpgcode
プラグインのSAN_AnalogMoveを使っています。
バージョンは3.1.5です。
時々、
TypeError
Cannot read property 'posNt' of undefined
と、エラー表示されるのですが原因がわかりません。
原因や対処策わかる方いたら教えて欲しいです。
よろしくお願いします。
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 15:08
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 通常キャラの上
トリガー:プレイヤーから接触
プライオリティの理解が不足しているのですが、ここを変えるとなぜこのエラーが発生するのでしょうか?
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 19:06
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 の更新時にイベントを取得できず、エラーになります。
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 19:15
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実行内容の「イベントの一時消去」をなくすとエラーがなくなります。
このような状況なのですが解決策ありませんでしょうか。
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 20:33
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);
});
};
})();
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 20:51
by rpgcode
Plasma Darkさん
ありがとうございます。
エラーが出なくなったことを確認しました!
プラグイン開発者さんやメンテナンスをされている方には本当に頭が下がる思いです。
こちらのパッチプラグイン使わせて頂きたいのですが、ライセンスはどうすればいいでしょうか?
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 21:21
by Plasma Dark
こちらのパッチプラグイン使わせて頂きたいのですが、ライセンスはどうすればいいでしょうか?
特に考えていませんでした。強いて言えばCC0ですね。ご自由にお使いください。
Re: SAN_AnalogMoveの'posNt'エラーの原因は?
Posted: 2021年5月29日(土) 21:28
by rpgcode
Plasma Darkさん
ありがとうございます。
では、そのように使わせていただきます。
頂いたアドバイスや解説、本当にためになります。
すべて理解できているわけではないのですが、読み返し徐々にでも理解できるよう努めていきたいと思います。
おかげさまでとても助かりました。
いつもながらありがとうございました。
こちらのスレッドは解決済みとします。