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 的地图在可移动区域之外,从而阻止它去你想要的地方。

你明白现在问题出在哪里了吗?

另一种解决方案是了解矩阵的大小,一旦 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 作为玩家在地图上的位置,这应该可以很好地工作。为玩家制作一种类型的坐标,为地图制作一种类型只会让此时更加混乱。但是,如果您确实需要为它们使用不同的坐标,则在尝试计算运动时应始终参考 playerX 和 playerY,如下所示:

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

这是因为您将 playerX 的值更改为 1 而不是 posX 的值,这将限制您的移动。如果这令人困惑,请告诉我,我会尝试更好地解释这一点。

于 2013-11-09T10:37:25.270 回答