ここ3日くらいAnalogMove(タッチパッド/スティック入力・非タイル移動プラグイン)とほかの移動系プラグインとの競合対策をしていました。

AnalogMoveはコアスクリプトのもともとの移動処理を変更するのではなく、移動の処理を○○Moverというオリジナルのものに変更するという方法で作られているので、ほかの移動系プラグインと競合しやすいです。

自分が見つけた競合は、つぎの2点。

別のプラグインからプレイヤーに対して移動系メソッドを呼びだすと、高速移動する

AnalogMoveを入れるとupdate処理が4回呼ばれるのが原因っぽい?
(1updateごとに1歩移動するので、通常より4倍の速度で移動)

移動ルートの設定中はAnalogMoveがオフになるので、移動系メソッドを直接呼ぶのではなく、 forceMoveRoute メソッド中継で呼びだすとよいです。

forceMoveRouteメソッドは引数にオブジェクトを渡さないといけないのでわかりづらいけど、「一歩前進」だったらつぎのような感じで呼び出せます。

移動ルートの指定に使うcodeはrpg_objects.jsのGame_Character.ROUTE_MOVE_〇〇という定数で定義されています。

競合するプラグインの処理が呼びだされない

階段で自動斜め移動してくれるStairMove(自動斜め移動プラグイン)などと一緒に使う場合、そのままだとStairMoveが動きません。

これはStairMoveがGame_Playerオブジェクトの executeMove メソッドを変更しているのに対し、AnalogMoveが executeMove メソッドを呼びだしていないから。

AnalogMoveでは $gamePlayer.canAnalogMove メソッドがtrueの時にアナログムーブが有効になり、無効の時にもともとの移動処理を呼びだします。

StairMoveと共存させたいなら、 canAnalogMove メソッドに「階段にいない時」という条件をたせばよいです。

ただ、それをやるのにけっこうな大工事するハメになりました。

まず、StairMove側で階段にいる判定をGame_Playerの isOnStair メソッドとしてメソッド化しました。

つぎにAnalogMoveのcanAnalogMoveメソッドに、$gamePlayer.isOnStairがfalseの時という条件を追加。

プラグインの読み込み順はStairMove→SAN_AnalogMoveの順にします。

これで階段にいる時はAnalogMoveが無効になり、StairMoveが有効になります。

プラグイン大改修が大変だったら、 canAnalogMove の判定にゲーム内スイッチを追加してもいいかもしれません。

スイッチ番号はお好みで指定。
これだとイベントからスイッチを操作してあるていど自分で制御できます。

ただこれだと階段で斜め上を入力した時にアナログムーブが無効になっていて斜め移動ができなくなります。

StairMoveを使わずに、AnalogMoveに階段の時の向きをセットしなおすのでもいいのかなー(悩み中)

おすすめの記事