2

編集投稿されたすべてのアルゴリズムを調整しました。現在、ほぼ完璧に機能しています。失敗するのは、左端の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の内側はタイルの座標です。

4

2 に答える 2

1

チュートリアルを見ると、マウスの座標から256(224 +幅の半分)を引く必要があるようです。それがうまくいくかどうか教えてください!

また、同じ方法でスプライトを削除するためだけに、スプライトを描画するたびに動的に新しいスプライトを割り当てないでください。わかりました。コードにこれ以上コメントを付けないようにします。;)

于 2012-05-26T22:27:12.773 に答える
1

結局、それは多くの丸め誤差が原因でした。

                if (screenX < 0 || tilePixelX < 0)
                    tilePixelX = 64 - abs(tilePixelX);
                if (screenY < 0 || tilePixelY < 0)
                    tilePixelY = 32 - abs(tilePixelY);
                if (tilePixelX >= 64)
                    tilePixelX = 63;
                if (tilePixelY >= 32)
                    tilePixelY = 31;

                if (screenX < 0 || screenY < 0)
                {
                    tilex--;
                    tiley++;
                }

場所によっては少し醜いハックだったとしても、それを整理しました。

于 2012-05-28T19:29:00.343 に答える