87 lines
3.6 KiB
JavaScript
87 lines
3.6 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc [v1.0.1] マップ拡大時のクリック座標ずれを修正(改訂版)。tilemap.x,y,scaleを考慮し、逆変換を正しく行います。
|
||
* @author
|
||
*
|
||
* @help
|
||
* =============================================================================
|
||
* ■ 概要
|
||
* =============================================================================
|
||
* - マップを拡大( tilemap.scale )+オフセット( tilemap.x,y )していると、
|
||
* マウスクリックで移動先を指定するとき座標が大幅にずれる問題が起こることがあります。
|
||
* - このプラグインは Game_Map.prototype.canvasToMapX/Y を上書きし、
|
||
* 以下のような計算で逆変換を行い、クリック先を正しく取得できるようにします:
|
||
*
|
||
* x' = ( x - tilemap.x ) / tilemap.scale.x
|
||
* y' = ( y - tilemap.y ) / tilemap.scale.y
|
||
*
|
||
* これにより「カーソル位置が拡大&オフセット分外側に行ってしまう」問題を修正します。
|
||
*
|
||
* ■ 使い方
|
||
* 1) このファイルを「IM_MapScaleMouseFix_Revised.js」として js/plugins に置き、
|
||
* プラグイン管理でONにします。
|
||
* 2) マップ拡大プラグイン(例: IM_MapScaleCenter_RoundedPixels.js)と併用し、
|
||
* tilemap.scale, tilemap.x,y によりマップを大きく描画している場合でも
|
||
* マウスクリックで正しくタイルが選択されるようになります。
|
||
*
|
||
* ■ 注意
|
||
* - もし独自にcanvasToMapX/Yをさらに上書きするプラグインがあれば競合する恐れがあります。
|
||
* 本プラグインを最下部に配置して試してください。
|
||
* - もし「まだずれる」場合、カメラやparallaxオフセットなど他要素が絡んでいる可能性があります。
|
||
* その場合はカメラやdisplayX,displayYの調整用プラグインも必要かもしれません。
|
||
*
|
||
* ■ バージョン
|
||
* v1.0.1 (2025/xx/xx):
|
||
* - 前回サンプルの x'=(x - tilemap.x)/scale + tilemap.x を修正
|
||
* - シンプルに x'=(x - tilemap.x)/scale にし、逆方向のずれを回避
|
||
* v1.0.0
|
||
* - 初版
|
||
*/
|
||
|
||
(() => {
|
||
"use strict";
|
||
|
||
// tilemap取得用
|
||
function currentTilemap() {
|
||
const scene = SceneManager._scene;
|
||
if (scene instanceof Scene_Map && scene._spriteset) {
|
||
return scene._spriteset._tilemap;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
// ラップ
|
||
const _Game_Map_canvasToMapX = Game_Map.prototype.canvasToMapX;
|
||
Game_Map.prototype.canvasToMapX = function(x) {
|
||
const tilemap = currentTilemap();
|
||
if (tilemap) {
|
||
const scale = tilemap.scale.x;
|
||
const ox = tilemap.x;
|
||
if (scale !== 1.0) {
|
||
// 逆変換 => (x - tilemap.x)/scale
|
||
x = (x - ox) / scale;
|
||
} else {
|
||
// scale==1.0ならオフセットだけ引く
|
||
x = x - ox;
|
||
}
|
||
}
|
||
return _Game_Map_canvasToMapX.call(this, x);
|
||
};
|
||
|
||
const _Game_Map_canvasToMapY = Game_Map.prototype.canvasToMapY;
|
||
Game_Map.prototype.canvasToMapY = function(y) {
|
||
const tilemap = currentTilemap();
|
||
if (tilemap) {
|
||
const scale = tilemap.scale.y;
|
||
const oy = tilemap.y;
|
||
if (scale !== 1.0) {
|
||
// 逆変換 => (y - tilemap.y)/scale
|
||
y = (y - oy) / scale;
|
||
} else {
|
||
y = y - oy;
|
||
}
|
||
}
|
||
return _Game_Map_canvasToMapY.call(this, y);
|
||
};
|
||
|
||
})();
|