第一个等距游戏

时间:2013-11-09 10:18:20

标签: c# tiles isometric

我的第一个等距游戏有问题。我不知道如何对待能够靠近墙边的玩家。在这一刻,球员可能会在绿色区域内移动。

我的地图:

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;

    }

Movemet:

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

我需要改进才能从墙到墙移动?

最好的问候,Krzysiek

1 个答案:

答案 0 :(得分: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的值,这将限制你的移动。如果这令人困惑,请告诉我,我会尝试更好地解释这一点。