93 lines
4.7 KiB
JavaScript
93 lines
4.7 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc [v1.3.0] マップを指定倍率で拡大し、毎フレーム座標丸め+roundPixelsでちらつきを最小限に抑えます。超軽量実装。
|
||
* @author
|
||
*
|
||
* @help
|
||
* =============================================================================
|
||
* ■ 概要
|
||
* =============================================================================
|
||
* - マップ描画 (Spriteset_Mapのtilemap) をプラグインパラメータ「MapScale」で拡大・縮小します
|
||
* - 画面中央を拡大の基点にし、プレイヤーが見切れない程度に調整
|
||
* - 毎フレーム updateTilemap() で tilemap.x,y を Math.round() し、サブピクセル描画を抑制
|
||
* - tilemap.roundPixels = true に設定し、描画時にピクセル単位で丸める
|
||
* - 外部プラグインやイベントが tilemap.scale を変えても毎フレーム監視して
|
||
* 再適用し、倍率が戻らないようにします
|
||
*
|
||
* ■ 使い方
|
||
* 1) このファイルを「IM_MapScaleCenter_RoundedPixels.js」として js/plugins に置き、
|
||
* プラグイン管理でONにします。
|
||
* 2) プラグインパラメータ「MapScale」を設定(例: 2.0 なら2倍、0.5なら半分)。
|
||
* 3) ゲーム起動時に tilemap.scale が設定され、以後毎フレームで
|
||
* 監視+座標丸め+roundPixelsを実行し、ちらつきが軽減されます。
|
||
*
|
||
* ■ 注意 / 制限
|
||
* - ピクチャや独自スプライトは拡大されず、あくまで「タイルマップ(地形とキャラチップ)」のみ
|
||
* - 倍率を極端に大きくすると画面端に黒帯が出るなどの副作用があり得ます。
|
||
* - サブピクセルのちらつきが完璧に消えるわけではありませんが、通常より大幅に減るはずです。
|
||
* - さらに高解像度のタイルを最初から用意すると画質がより安定しますが、
|
||
* このプラグインは「とりあえず軽量に拡大する」方針です。
|
||
*
|
||
* ■ バージョン情報
|
||
* v1.3.0 (2025/xx/xx):
|
||
* - tilemap.roundPixels = true を追加し、サブピクセルをより抑制
|
||
* - 毎フレーム座標をMath.round()し、拡大率が戻されても監視で再適用
|
||
* v1.2.x などは省略
|
||
*
|
||
* @param MapScale
|
||
* @text マップ表示倍率
|
||
* @desc タイルマップの拡大率(1.0=等倍,2.0=2倍,0.5=半分など)
|
||
* @type number
|
||
* @decimals 2
|
||
* @min 0.01
|
||
* @default 2.0
|
||
*/
|
||
|
||
(() => {
|
||
"use strict";
|
||
|
||
const pluginName = "IM_MapScaleCenter_RoundedPixels";
|
||
const parameters = PluginManager.parameters(pluginName);
|
||
const scaleParam = parseFloat(parameters["MapScale"] || "2.0");
|
||
const userScale = (!isNaN(scaleParam) && scaleParam > 0) ? scaleParam : 1.0;
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Spriteset_Map.createTilemap
|
||
//--------------------------------------------------------------------------
|
||
// 初回に tilemap.scale, tilemap.roundPixels を設定
|
||
const _Spriteset_Map_createTilemap = Spriteset_Map.prototype.createTilemap;
|
||
Spriteset_Map.prototype.createTilemap = function() {
|
||
_Spriteset_Map_createTilemap.call(this);
|
||
if (this._tilemap) {
|
||
this._tilemap.scale.set(userScale, userScale);
|
||
this._tilemap.roundPixels = true; // PIXIが小数座標を丸めて描画
|
||
}
|
||
};
|
||
|
||
//--------------------------------------------------------------------------
|
||
// Spriteset_Map.updateTilemap
|
||
//--------------------------------------------------------------------------
|
||
// 1) 毎フレーム tilemap.scale が外部干渉で変えられていないか確認し、変更されてたら戻す
|
||
// 2) (1-userScale)*(画面中央)を計算 → Math.round して tilemap.x, y に適用
|
||
const _Spriteset_Map_updateTilemap = Spriteset_Map.prototype.updateTilemap;
|
||
Spriteset_Map.prototype.updateTilemap = function() {
|
||
_Spriteset_Map_updateTilemap.call(this);
|
||
|
||
// scale 監視
|
||
if (this._tilemap.scale.x !== userScale || this._tilemap.scale.y !== userScale) {
|
||
this._tilemap.scale.set(userScale, userScale);
|
||
}
|
||
|
||
// 画面中央を基点(例:2倍なら左上に行きすぎないよう補正)
|
||
// → offset = (1 - userScale) * (screenWidth/2)
|
||
const sw = Graphics.width;
|
||
const sh = Graphics.height;
|
||
const offsetX = (1 - userScale) * (sw / 2);
|
||
const offsetY = (1 - userScale) * (sh / 2);
|
||
|
||
// 座標を丸めてサブピクセルを抑制
|
||
this._tilemap.x = Math.round(offsetX);
|
||
this._tilemap.y = Math.round(offsetY);
|
||
};
|
||
|
||
})();
|