如何检查我的播放器是否与对象发生碰撞?

时间:2013-04-21 16:39:13

标签: c# xna collision

我正准备在我的XNA游戏中完成另一个功能,但我想知道你应该如何检查并查看玩家是否已停止与某个物体相交。

目前,我有一个bool,当玩家与一颗小行星相交,即隐藏在它后面时,这是真的。但我需要找出玩家何时停止与所述小行星相交以允许bool返回false并为我的敌人提供不同的移动路径。

到目前为止

代码:

    Rectangle rectangle1;
    Rectangle rectangle2;

    rectangle1 = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Width, player.Height);

    for (int i = 0; i < asteroids.Count; i++)
    {
        rectangle2 = new Rectangle((int)asteroids[i].Position.X, (int)asteroids[i].Position.Y, asteroids[i].Width, asteroids[i].Height);

        if (rectangle1.Intersects(rectangle2))
        {
            hidden = true;
        }
    }

我只是不知道如何检查其他状态。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我会略微改变这种方法。

首先不要每帧声明一个矩形。而是在创建asterioids和player时创建矩形。然后在每个相应的更新中,使用实体位置更新矩形的位置。

所以rectangle1现在是player.rectangle(我建议得到集合但是为了这个目的,它不是一个问题)而矩形2是asteroid.rectangle。

接下来,我将进行两项修改之一。如果您只关心检查是否发生了冲突,请在执行检查之前将布尔值更改为false。如果没有发生碰撞,那么布尔值将保持为假,但是如果执行了碰撞,布尔值应该更改为true,然后你需要使用break关键字来退出循环。

// ensure rectangle's positions reflect the entity's position before checking.
hidden = false;

for (int i = 0; i < asteroids.Count; i++)
{
    if (player.rectangle.Intersects(asteroids[i].rectangle))
    {
        hidden = true;
    }
}

或者如果您需要检查多次碰撞,我会使用稍微不同的方法。如果发生了碰撞,我会存储小行星的位置,然后再用它来确定如何影响玩家的移动。这将允许一次处理多个冲突。由于其他原因,您可能仍然需要布尔值,所以我保留了它,但您可以检查列表中有多少元素。我还要注意,为了更准确地处理碰撞,需要更多的数据,如质量,重力等,但这是一个完全独立的主题。

// ensure rectangle's positions reflect the entity's position before checking.

List<Vector2> collisionPositions = new List<Vector2> positions;
hidden = false;

for (int i = 0; i < asteroids.Count; i++)
{
    if (player.rectangle.Intersects(asteroids[i].rectangle))
    {
        hidden = true;
        collisionPositions.add(asteroids[i].position);

    }
}