如何使对象在XNA中发生碰撞

时间:2015-03-30 16:31:32

标签: c# xna 2d

最近我一直在尝试在XNA中制作2D游戏,但我似乎已经走到了尽头。无论我在互联网上看到什么,我似乎无法找到如何使两个对象在XNA中发生碰撞的任何示例。我非常清楚如何检测某些东西是否发生碰撞,而不是在if语句之间放置什么。

在我的情况下,它试图让玩家不通过屏幕上的任何块。我尝试了几种方法,但似乎没有一种方法可行。 :(

提前致谢!

1 个答案:

答案 0 :(得分:3)

所以,这是一种肮脏的解决方案,但你可以保存你所在的位置,移动,然后如果碰撞,则恢复到原来的位置。

这是一个代码示例,提供检查碰撞的方法称为doesCollide(),您执行游戏逻辑和相应移动播放器的方法称为update()

此外,getX(),getY(),setX()和setY()只是获取/设置播放器坐标的方法。

int lastX = player.getX();
int lastY = player.getY();

player.update();
if(player.doesCollide()){
    player.setX(lastX);
    player.setY(lastY);
}

当玩家高速移动时,此方法尤其面临问题,因为玩家可能会遇到障碍物或者无法靠近墙壁。 这是一个解决方案,但它甚至更脏:

int lastX = player.getX();
int lastY = player.getY();

player.update();

int moveX = player.getX() - lastX;
int moveY = player.getY() - lastY;

player.setX(lastX);
player.setY(lastY);    //we're basically figuring out where the player would move

int ratio = moveY / moveX;
for(int i = 0; i < moveX; i++){     //we move the player pixel by pixel
    player.setX(lastX + i);
    player.setY(lastY + (int) (i * ratio));
    if(player.doesCollide()){     //we revert the last pixel move
         player.setX(lastX + i - 1);
         player.setY(lastY + (int) ((i - 1) * ratio));
    }
}