我在自上而下的游戏中实现了一个简单的基于瓦片的碰撞系统,但是我在移动角落时遇到了问题。目前,我的程序需要玩家的中心点,并在20px的正方形网格(交替的灰色cbackground)上绘制一个图块。它检查上下左右瓷砖是否发生碰撞,如果发现其中一个,就会移动到下一个阶段。基于图块的碰撞;角点碰撞问题
下一个阶段是检查玩家为瓦片内。为此,我有一个名为getCenterDistanceFromCurrentTile()
(我知道的创意名称)的功能。这将返回从瓦片中心点到玩家中心点距离的Vector2i(x和y)。然后我用下面的方法来使用它。
- 如果有一个壁砖的左侧,和玩家的距离x < 0(玩家的当前瓦片的中心点的左侧),玩家移动到瓦片的x旁壁。
- 如果有一个壁到右边,和玩家的距离x为> 0(当前瓦片的中心点的右侧),玩家被移动到旁边的墙上的瓷砖的x。
- 这对于Y轴以相同的方式继续。
我的问题是对角线。我目前不检查对角线碰撞,但看起来我不得不这样做。我已经试图实现它,但玩家在角落时跳来跳去。我一起使用了上述玩家x < 0和玩家y < 0的方法,这些方法都没有解决。我已经做了一些图像来更好地解释我的问题。
此图片展示了我的碰撞系统工作正常,与碰撞到左侧(用蓝色瓷砖所示),并正在检查的粉红色的瓷砖,但没有发现碰撞。绿色图块显示玩家当前的图块,红色图块显示玩家的当前位置。
该图像清楚地显示我的问题。粉红色的瓷砖没有与任何物体相撞,因此玩家的x和y不需要检查。
我应该如何在我的游戏检查角落碰撞?
我目前的碰撞检测代码;
public boolean isWall(Vector2i loc)
{
return this.isWall(loc.x, loc.y);
}
public boolean isWall(int x, int y)
{
if (x < 0) return true;
if (y < 0) return true;
if (y > map[0].length-1) return true;
if (x > map.length-1) return true;
return map[x][y];
}
public void phys(Player plr) {
Vector2i playerTile = plr.getTile();
// Left
if (isWall(playerTile.x-1, playerTile.y))
{
Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true);
if (distanceFromTile.x < 0)
{
plr.setX(playerTile.x*BLOCK_SIZE);
}
}
// Right
if (isWall(playerTile.x+1, playerTile.y))
{
Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true);
if (distanceFromTile.x > 0)
{
plr.setX(playerTile.x*BLOCK_SIZE);
}
}
// Up
if (isWall(playerTile.x, playerTile.y-1))
{
Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true);
if (distanceFromTile.y < 0)
{
plr.setY(playerTile.y*BLOCK_SIZE);
}
}
// Down
if (isWall(playerTile.x, playerTile.y+1))
{
Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true);
if (distanceFromTile.y > 0)
{
plr.setY(playerTile.y*BLOCK_SIZE);
}
}
}
谢谢,我用这个作为一个指针和固定它。我修改的代码; https://gist.github.com/4485362 –