青林檎さん
こんにちは! 面白そうな質問内容でしたので、考えてみました。
イベントで変数に代入できるマップ座標と画面座標は下記の様になっていました。
コード: 全て選択
case 5: // Character
var character = this.character(param1);
if (character) {
switch (param2) {
case 0: // Map X
return character.x;
case 1: // Map Y
return character.y;
case 2: // Direction
return character.direction();
case 3: // Screen X
return character.screenX();
case 4: // Screen Y
return character.screenY();
}
}
break;
this._realX と this.x および this._realY と this.y は基本的に同一と考えると、
下記の様に変換できると考えます。検証の方お願い出来ますでしょうか?
※キャラクターの場合のジャンプの高さと6px上にシフトさせている点は無視しております。
・マップ座標XYから変換して画面座標XYを求める場合
コード: 全て選択
var MapX = マップ座標X;
var MapY = マップ座標Y;
var ScreenX = Math.round($gameMap.adjustX(MapX) * $gameMap.tileWidth() + $gameMap.tileWidth() / 2);
var ScreenY = Math.round($gameMap.adjustY(MapY) * $gameMap.tileHeight() + $gameMap.tileHeight());
・画面座標XYから変換してマップ座標XYを求める場合
コード: 全て選択
var real_MapX = マップ座標X;
var real_MapY = マップ座標Y;
var ScreenX = 画面座標X;
var ScreenY = 画面座標Y;
var isLoopMapX = ($gameMap.isLoopHorizontal() && real_MapX < $gameMap.displayX() - ($gameMap.width() - $gameMap.screenTileX()) / 2)? $dataMap.width : 0;
var isLoopMapY = ($gameMap.isLoopVertical() && real_MapY < $gameMap.displayY() - ($gameMap.height() - $gameMap.screenTileY()) / 2)? $dataMap.height : 0;
var MapX = Math.round((ScreenX - $gameMap.tileWidth()/2)/$gameMap.tileWidth()+$gameMap.displayX() - isLoopMapX)
var MapY = Math.round((ScreenY - $gameMap.tileHeight())/$gameMap.tileHeight()+$gameMap.displayY() - isLoopMapY)
ループしているマップを考慮する場合、マップ座標XYに変換するためにマップ座標XYを使用する点が改善点ですが、
ループしていないマップの場合は下記で求められると考えられます。
コード: 全て選択
var ScreenX = 画面座標X;
var ScreenY = 画面座標Y;
var MapX = Math.round((ScreenX - $gameMap.tileWidth()/2)/$gameMap.tileWidth()+$gameMap.displayX())
var MapY = Math.round((ScreenY - $gameMap.tileHeight())/$gameMap.tileHeight()+$gameMap.displayY())
以上です! 結果報告お待ちしております!