タイマーがマップと一緒にズームされているように思えます。MVでは、タイマーのスプライトはマップのspriteset内に配置されるため、プレイヤーを中心に画面全体が拡大されると、右上隅にあるタイマーが画面外に押し出されてしまいます。もしこれをspritesetから取り出して、ズームの影響を受けないようにしたらどうでしょうか?このコードを新しい.jsファイルとしてjs/pluginsフォルダに保存し、プラグインマネージャーで有効にしてください。
(function() {
var _Scene_Map_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
Scene_Map.prototype.createDisplayObjects = function() {
_Scene_Map_createDisplayObjects.call(this);
var timer = this._spriteset._timerSprite;
if (timer) {
this._spriteset.removeChild(timer);
this.addChildAt(timer, this.children.indexOf(this._windowLayer));
}
};
})();
中心からのずれが主にマップの端付近で発生しているのではないでしょうか。このプラグインは、画面上のプレイヤーの位置を中心にズームを行います。そのため、カメラがマップの端でスクロールを停止し、プレイヤーが画面中央からずれても、表示可能なマップ領域が残っている場合でも、ズームされた状態が維持され、プレイヤーは中央からずれたままになります。
ED5_ScrollWheelZoom.js内のupdateZoom関数の中で、以下の行を入れ替えてみてください。
const playerX = $gamePlayer.screenX();
const playerY = $gamePlayer.screenY();
$gameScreen.setZoom(playerX, playerY, zoom);
これにより、プレイヤーが画面の中央に来るようにズーム点を設定し、マップの端を超えてしまう場合にのみ制限がかかります:
const tw = $gameMap.tileWidth();
const th = $gameMap.tileHeight();
let zoomX = $gamePlayer.scrolledX() * tw + tw / 2;
let zoomY = $gamePlayer.scrolledY() * th + th / 2;
if (zoom > 1.001) {
zoomX = (zoomX * zoom - Graphics.width / 2) / (zoom - 1);
zoomY = (zoomY * zoom - Graphics.height / 2) / (zoom - 1);
zoomX = Math.min(Math.max(zoomX, 0), Graphics.width);
zoomY = Math.min(Math.max(zoomY, 0), Graphics.height);
}
$gameScreen.setZoom(zoomX, zoomY, zoom);
さらに下にあるsetDestination関数内で、zoomXとzoomYの行を以下のように変更して、マップの端でズーム点が0になった場合でも、クリック移動時に補正がかかるようにしてください:
const zoomX = $gameScreen.zoomX();
const zoomY = $gameScreen.zoomY();
オーロラの表示コマンドは画面モードを使用していますか?これがプラグインのデフォルト設定であり、画面モードではオーロラが画面自体に固定されます。そのため、マップがプレイヤーを中心にズームしても、オーロラは画面内で固定されたままになり、まるで追従しているように見えます。マップモードでは、オーロラはマップピクセル上に配置されるため、マップと共にズームやスクロールが行われます:
DRAGON_NorthernLights:show <mode: "map", x: 0, y: 0, width: 0, height: 0>
マップモードでは、xとyはマップの左上からカウントされ、widthまたはheightに0を設定すると画面サイズが使用されます。マップが画面より大きい場合は、幅を「マップのタイル数 × 48」に設定することをお勧めします。