編集投稿されたすべてのアルゴリズムを調整しました。現在、ほぼ完璧に機能しています。失敗するのは、左端の9つのタイルです(写真は下部にあります)。ほとんどの場合、これらの9つのうちの1つにカーソルを合わせると、完全に間違ったタイルが選択されます。
EDIT2問題はscreenXまたはscreenYが負の場合のエラーが原因であるとほぼ確信しているので、おそらくtilePixelX / Yでmath.absを使用することになりますが、それだけではありません。そうでない場合、結果は得られません。遠く離れている(貢献している可能性はあるが)
私は等角ゲームを作っています、そして今私は地図レンダリングエンジンに取り組んでいます。理論的にはかなり単純なはずですが、マウスの位置からタイル座標を取得することはできません。
私のタイルは幅64、高さ32です。以下に画像を示します。
私の地図はかなり完璧に表示されます:
実際の問題は上部に説明されています。
現在使用しているコードは次のとおりです。
int screenX = sf::Mouse::getPosition(window).x - 250;
int screenY = sf::Mouse::getPosition(window).y - 250;
int tilex = floor((screenY / 32) + (screenX / 64));
int tiley = floor((screenY / 32) - (screenX / 64));
int tilePixelX = abs(screenX % 64); // I believe part of the problem
int tilePixelY = abs(screenY % 32); // is absoluting these. Not all though.
sf::Color mCol = mouseMap.getPixel(tilePixelX, tilePixelY);
if (mCol.r == 20)
tilex -= 1;
else if (mCol.r == 40)
tiley -= 1;
else if (mCol.r == 60)
tilex += 1;
else if (mCol.r == 80)
tiley += 1;
私は今、素晴らしい動作をしているマウスマップを使用していますが、上記のように、ダイヤモンドの左端の9つのタイルでまだ失敗しています(それらにカーソルを合わせると、4〜5タイル離れているように見えるランダムに選択されるか、タイルがまったく選択されません(私はマップの範囲外を推測しています):
これは、問題のあるタイルが赤で強調表示されていることも示しています。
これは、私のレンダリングエンジンがどのように機能するかを理解するために、マップがどのように見えるかを示しています。透明なピクセルは空と見なされ、黒いピクセルは壁と見なされることに注意してください(上の画像ではレンダリングしなかったため、上の画像に表示されているタイルはいずれも0列目または0行目ではなく、最後の行。
ほとんどのマップが機能しているため、私のマウスマップは間違いなく正しいですが、とにかくここにあります。
編集:
必要なファイルとDLLをzipファイルにパッケージ化したので、それを実行して何が起こっているかを自分で確認できます。
https://dl.dropbox.com/u/37019412/Broken.zip
描画式は次のとおりです。
(x - y) * 32 + 250, (x + y) * 16 + 250
コマの前はX、後はYで、xとyの内側はタイルの座標です。