ズーム時にED5_ScrollWheelZoomがプレイヤーキャラクターを正しく中心に合わせるには?

やあ!友人に、すでにRPGMaker MVで使っているズームプラグインよりも優れていると勧められて、このプラグインを試してみようと思っています。このプラグインはマウススクロールでズームインできるのですが、キャラクターの中心にうまく合わせられないのと、ズームインするとタイマーのカウントダウンが隠れてしまうことに気づきました。これらの問題を直す方法をご存知の方はいますか?このプラグインは気に入っているのですが、タイマーが隠れることと、中心合わせの不具合についてどうすればいいか分かりません。

また、高額を払って発注したオーロラ(北極光)のプラグインと競合しているようです。ズームするとオーロラが一緒に動いてしまい、固定されません。これも直す方法はありますか?

以下にプラグインを添付します。誰かこれらの問題を直せる方法を教えてもらえると嬉しいです。他にまともな代替手段が分からないので。

DRAGON_NorthernLights.zip (25.2 KB)

ED5_ScrollWheelZoom.zip (30.0 KB)

これを直す方法をご存知の方はいらっしゃいますか…?お願いします。

タイマーがマップと一緒にズームされているように思えます。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」に設定することをお勧めします。