0

初めてのアイソメトリック ゲームで問題が発生しました。プレイヤーが壁の端に近づくことができるようにする方法がわかりません。この瞬間、プレイヤーは緑のエリアを動き回るかもしれません。

私の地図:

int[,] map = new int[,] 
        {

            {1, 1, 1, 1, 1, 1, 1, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 0, 0, 0, 0, 0, 0, 1},
            {1, 1, 1, 1, 1, 1, 1, 1}

        }; 

変数:

int TileWidth = 50;
int TileHeight = 50;
int posX = 2; // map X position
int posY = 2; // map Y position
float playerX = 2 * 50; // player X position
float playerY = 2 * 50; // player Y position

壁を検出:

    public bool detectSolidTile(int x, int y)
    {

        if (map[y, x] == 1) return true;  else return false;

    }

動き:

posX = (int)(Math.Floor((playerX) / 50));
posY = (int)(Math.Floor(playerY / 50));

(...)

        if (slide == 1 && !detectSolidTile(posX + 1, posY))
        {
            playerX++;
        }
        if (slide == 2 && !detectSolidTile(posX - 1, posY))
        {
            playerX--;
        }

画像 -> http://s16.postimg.org/cxkfomemd/tiles.jpg

壁から壁へと移動できるようにするには、何を改善する必要がありますか?

敬具、クルジシェク

4

1 に答える 1

0

移動できるマップをすべて 0 にしてから、移動できないマップを 1 にします。新しい移動を試みるときは、将来の位置が 1 になるか 0 になるかを確認します。0 の場合は移動させます。そうでなければ、あなたは彼を止めます。

    if (slide == 1 && !detectSolidTile(posX + 1, posY))
    {
        playerX++;
    }

これにより、1 のマップが可動領域外にあることが検出され、目的の場所に移動できなくなります。

今どこに問題があるか分かりますか?

もう 1 つの解決策は、行列のサイズを理解することです。x または y が最大値に達するとすぐに、それらのインクリメントを停止します。ただし、後で障害物を追加する場合は、現在行っていることを続けますが、0 がマップ用、1 がマップ外用であることを確認してください。

BartoszKP の編集は次のとおりです。は彼のコードを修正していません。

彼の問題に使用するコードは少し異なります。

まず、playerX と playerY をドロップします。これは、posX と posY とまったく同じものであるため、追加の計算を行うだけです。これは、移動アルゴリズムが次のようになると言われています。

変数:

int TileWidth = 50; 
int TileHeight = 50;
int posX = 2; // map X position - same thing as playerX 
int posY = 2; // map Y position - same thing as playerY 
//posX and posY will now hold the position of your player on the map since your conversion from playerX to playerY will only work if you increment a value by 50 or more.

壁を検出する: //座標 x と y のタイルが壁の場合は true を返す //そうでない場合は false を返す public bool detectSolidTile(int x, int y) {

    if (map[y, x] == 1) return true;
    else return false;
}

動き:

posX = (int)(Math.Floor((playerX) / 50)); //drop this you don't need it
posY = (int)(Math.Floor(playerY / 50)); //drop this too, you are using posX and posY to store locations

(...)

        if (slide == 1 && !detectSolidTile(posX + 1, posY))
        {
            posX++;
        }
        if (slide == 2 && !detectSolidTile(posX - 1, posY))
        {
            posX--;
        }

        if (slide == 3 && !detectSolidTile(posX, posY+1))
        {
            posY++;
        }
        if (slide == 4 && !detectSolidTile(posX, posY-1))
        {
            posY--;
        }

これは、マップ上のプレーヤーの位置として posX と posY を使用すると、非常にうまく機能するはずです。プレイヤー用に 1 種類の座標を作成し、マップ用に 1 種類の座標を作成すると、この時点でさらに混乱します。しかし、実際にそれらに異なる座標を使用する必要がある場合は、次のように動きを計算しようとするときに、常に playerX と playerY を参照する必要があります。

if (slide == 1 && !detectSolidTile((int)(Math.Floor((playerX+1) / 50)) + 1, posY))
{
    playerX++;
} 

これは、posX の値ではなく、playerX の値を 1 だけ変更しているためです。これにより、動きが制限されます。これが紛らわしい場合はお知らせください。これをよりよく説明します。

于 2013-11-09T10:37:25.270 に答える