等尺性レンダリングとピッキング?


23

私は、ダイアモンド型の世界で等尺性タイルをプロット(world-> screen)およびマウス選択(world-> screen)するための式を探していました。私が試したものは常に、うまくいっているように見えます。これを行うための通常/正しい方法は何ですか?


使用される正確な方法と式は、タイルの形状と、おそらくマップの描画方法(マップの上部、下部、または側面の1つが0,0)に少し依存します。詳細あなたの問題について助けます。
テダイアン

1
タイルは2:1(より具体的には64x32)です。エディターを書いているので、座標系は関係ありません。(ただし、上部または左側の0,0は賢明なようです。)
mpnk121

質問に非常に遅れており、完全な答えすらありませんが、この正確なテーマに関して非常に優れたGoogle Tech Talkがありました。それらのセットアップには、任意の画像の非透過部分の選択(javascriptでも同様)が含まれます。 youtube.com/watch?v=_RRnyChxijA
セスバティン

回答:


21

あなたのコメントに基づいて、タイルのx、y値を画面上の座標に変換するために使用しているコードを次に示します。現在、「3Dタイル」は考慮されていないため、すべてが同じ平面上にあると見なされるため、それが重要なゲームを作成している場合、このコードは機能しません。

//this converts a map x/y coordinate into screen coordinates
//public, static method, so can be called outside the Tile object
point Tile::convertToScreen(int x, int y, int offsetX, int offsetY)
{
        point screen;
        //calculate the screen coordinates
        //note: these will then be modified by the camera
        screen.x = offsetX - (y * TILE_WIDTH/2) + (x * TILE_WIDTH/2) - (TILE_WIDTH/2);
        screen.y = offsetY + (y * TILE_DEPTH/2) + (x * TILE_DEPTH/2);
        return screen;
 }

pointは単純にxとyのintを含む構造体であり、TILE_WIDTHはあなたの場合は64になり、TILE_DEPTHはちょっと悪い名前になります(実際にはタイルグラフィックの高さです)が、32になります。オフセットは、タイルマップを別のX、Y位置で「開始」する場合(タイルを別のタイルセットの上に配置する場合など)です。通常、オフセットは0,0です。

これにより、次のように、上部、中央に0,0のマップが生成されます。

        0,0
    0,1     1,0
0,2     1,1     2,1

カーソルのタイルx、yを見つけることに関して:

point selectedTile;
int x = mX - camera.x;
int y = mY - camera.y;
selectedTile.x = (y + x/2)/TILE_DEPTH;
selectedTile.y = (y - x/2)/TILE_DEPTH;

このコードでは、mXとmYはマウススクリーン座標であり、カメラの値と組み合わせて、「世界座標」のどこにいるかを見つけます。他のすべては前のコード例と同じです。

繰り返しますが、これは平面の2Dアイソメトリックタイルマップを想定しています。マップのセミ3Dビューを使用する場合は、追加の作業が必要です。これは、いずれにせよ2Dで作業していることを前提としています。


1
ありがとうございました!-これはフラットマップに最適です。さて、別のレイヤー上にある任意のサイズの(つまりZ深度の)タイルを追加する方法についてもう少し教えてください。(井戸、または街灯のような小道具など)
-mpnk121

2
それは、offsetYとoffsetXの値を使用するときです。街灯が64x64の場合、offsetY値に負の32を渡すと、正しい場所に表示されます。うまくいけば、これで開始できます。
テダイアン

6
あなたの例の座標「2,1」は「2,0」であってはなりませんか?
クリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.