-1

我正在完成我的 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;
        }
    }

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

4

1 回答 1

0

我会稍微改变这种方法。

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

因此,rectangle1 现在是 player.rectangle(我建议 get sets,但出于此目的,这不是问题), rectangle2 是 asteroid.rectangle。

接下来,我将进行两项更改之一。如果您只关心检查是否发生了冲突,请在执行检查之前将布尔值更改为 false。如果没有发生冲突,则该布尔值将保持为假,但如果发生冲突,则布尔值应更改为真,然后您需要使用 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);

    }
}
于 2013-04-21T21:36:04.780 回答