我的第一个等距游戏有问题。我不知道如何对待能够靠近墙边的玩家。在这一刻,球员可能会在绿色区域内移动。
我的地图:
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
答案 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的值,这将限制你的移动。如果这令人困惑,请告诉我,我会尝试更好地解释这一点。