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

问题描述 投票:-1回答:1

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

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

代码到目前为止:

    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;
        }
    }

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

c# xna collision
1个回答
0
投票

我稍微改变了这种方法。

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

所以rectangle1现在是player.rectangle(我建议得到集合,但出于此目的,它不是一个问题)而rectangle2是asteroid.rectangle。

接下来我会做两个改变之一。如果您只关心检查是否发生了冲突,请在执行检查之前将布尔值更改为false。如果没有发生冲突,那么boolean将保持为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);

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.