私は等角ゲームを書いていますが、残念ながら、画面座標から世界座標に(またはその逆に)マップするために使用されるアルゴリズムで書き続けることができません。とにかく、GetScreenX/Yメソッドの逆である実装を理解することはできません。ここにいくつかのコードがあります。widthとheightは、タイルのビューポート領域の幅/高さを表します。
正しい実装で、これは問題なく実行されるはずです。Linqpadで実行できます。
void Main()
{
for(int width = 1;width<15;width++)
{
for(int height = 1;height<10;height++)
{
for(int x = -50;x<50;x++){
for(int y = -50;y<50;y++){
var screenX = GetScreenX(x, y, width, height);
var screenY = GetScreenY(x, y, width, height);
var worldX = GetWorldX(screenX, screenY, width, height);
var worldY = GetWorldY(screenX, screenY, width, height);
if (worldX != x || worldY != y)
{
throw new Exception("Algorithm not right!");
}
}
}
}
}
}
protected int GetScreenX(int x, int y, int width, int height)
{
return WrappingMod(x + y, width);
}
protected int GetWorldX(int x, int y, int width, int height)
{
return 1; //needs correct implementation
}
protected int GetWorldY(int x, int y, int width, int height)
{
return 1; //needs correct implementation
}
protected int GetScreenY(int x, int y, int width, int height)
{
return WrappingMod((int) ((y - x)/2.0), height);
}
static int WrappingMod(int x, int m)
{
return (x % m + m) % m;
}
質問する必要がありますが、私は私の知恵の終わりにいます!