目次
ここ3日くらいAnalogMove(タッチパッド/スティック入力・非タイル移動プラグイン)とほかの移動系プラグインとの競合対策をしていました。
AnalogMoveはコアスクリプトのもともとの移動処理を変更するのではなく、移動の処理を○○Moverというオリジナルのものに変更するという方法で作られているので、ほかの移動系プラグインと競合しやすいです。
自分が見つけた競合は、つぎの2点。
別のプラグインからプレイヤーに対して移動系メソッドを呼びだすと、高速移動する
AnalogMoveを入れるとupdate処理が4回呼ばれるのが原因っぽい?
(1updateごとに1歩移動するので、通常より4倍の速度で移動)
移動ルートの設定中はAnalogMoveがオフになるので、移動系メソッドを直接呼ぶのではなく、forceMoveRouteメソッド中継で呼びだすとよいです。
forceMoveRouteメソッドは引数にオブジェクトを渡さないといけないのでわかりづらいけど、「一歩前進」だったらつぎのような感じで呼び出せます。
var routeForward = {code: Game_Character.ROUTE_MOVE_FORWARD, indent: null}
var routeEnd = {code: Game_Character.ROUTE_END , indent: null}
$gamePlayer.forceMoveRoute({list: [routeForward, routeEnd],repeat: false,skippable: true,wait: false});
移動ルートの指定に使う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と組み合わせるために関数化
Game_Player.prototype.isOnStair = function(){
var sm = $TKMvar.stairMove;
if(this.regionId() === sm.regionLDRU || this.regionId() === sm.regionLURD) {
var yDirection;
if(this.regionId() === sm.regionLDRU) yDirection = (this.direction() === 4) ? 2 : 8;
else yDirection = (this.direction() === 4) ? 8 : 2;
var x2 = $gameMap.roundXWithDirection(this.x, this.direction());
var y2 = $gameMap.roundYWithDirection(this.y, yDirection);
if($gameMap.regionId(x2, y2) === this.regionId()) {
return true;
}
}
return false;
}
つぎにAnalogMoveのcanAnalogMoveメソッドに、$gamePlayer.isOnStairがfalseの時という条件を追加。
// アナログムーブ可能判定
Game_Player.prototype.canAnalogMove = function() {
return (
SceneManager.isSceneActive() &&
this.hasMover() &&
this.canMove() &&
!this.isJumping() &&
!this.isMoveRouteForcing() &&
!this.isOnStair()
);
};
プラグインの読み込み順はStairMove→SAN_AnalogMoveの順にします。
これで階段にいる時はAnalogMoveが無効になり、StairMoveが有効になります。
プラグイン大改修が大変だったら、canAnalogMoveの判定にゲーム内スイッチを追加してもいいかもしれません。
// アナログムーブ可能判定
Game_Player.prototype.canAnalogMove = function() {
return (
SceneManager.isSceneActive() &&
this.hasMover() &&
this.canMove() &&
!this.isJumping() &&
!this.isMoveRouteForcing() &&
$gameSwitches.value(スイッチ番号)
);
};
スイッチ番号はお好みで指定。
これだとイベントからスイッチを操作してあるていど自分で制御できます。
ただこれだと階段で斜め上を入力した時にアナログムーブが無効になっていて斜め移動ができなくなります。
StairMoveを使わずに、AnalogMoveに階段の時の向きをセットしなおすのでもいいのかなー(悩み中)