我如何运行检查,看看我的播放器是否与物体碰撞

本文关键字:播放器 我的 看我 是否 碰撞 何运行 运行 检查 | 更新日期: 2023-09-27 18:10:18

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

我只是不知道如何检查其他状态。什么好主意吗?

我如何运行检查,看看我的播放器是否与物体碰撞

我想稍微改变一下这种方法。

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

所以rectangle1现在是player。矩形(我建议获取集合,但出于这个目的,这不是一个问题)和矩形2是小行星。矩形。

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