画面座標からマップ座標を割り出す方法

青林檎
記事: 11
登録日時: 2018年8月18日(土) 23:25

画面座標からマップ座標を割り出す方法

投稿記事by 青林檎 » 2019年1月24日(木) 02:23

お世話になっております。
画面座標XYからマップ座標XYを割り出す方法についての質問です。

調べたところ(恐らく)実現可能なようなのですが、
具体的な計算式や変数の組み立て方がわからず四苦八苦しております…。
どなたかご存知の方いらっしゃいましたらご助力頂けると幸いです。

よろしくお願い致しますm(_ _)m

アバター
飯尾隼人
記事: 19
登録日時: 2018年3月05日(月) 16:57
連絡を取る:

Re: 画面座標からマップ座標を割り出す方法

投稿記事by 飯尾隼人 » 2019年1月26日(土) 14:41

青林檎さん

 こんにちは! 面白そうな質問内容でしたので、考えてみました。
 イベントで変数に代入できるマップ座標と画面座標は下記の様になっていました。

コード: 全て選択

    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())


 以上です! 結果報告お待ちしております!
________________________________________
「渡り鳥の楽園」
飯尾隼人
HP: http://wataridori-rakuen.jp/Elves/
twitter: https://twitter.com/wataridori_raku
Ci-en: https://ci-en.jp/creator/2449
________________________________________
青林檎
記事: 11
登録日時: 2018年8月18日(土) 23:25

Re: 画面座標からマップ座標を割り出す方法

投稿記事by 青林檎 » 2019年3月27日(水) 04:50

返信が遅れてしまい申し訳ございません。
画面座標からツクールMVのタイルの48pxを除算することで、
擬似的にその座標に近いマップ座標XYを割り出すという方法で自己解決致しました。

素早い対応、ご回答ありがとうございました。m(_ _)m

“MV:質問” へ戻る