如何检查游戏对象是否在特定半径内

本文关键字:是否 对象 何检查 检查 游戏 | 更新日期: 2023-09-27 18:01:25

我很难检查游戏对象是否在与玩家相比的特定半径内。

我的游戏对象包含一个半径,我想用它来检查,但我失败了。

这是我到目前为止的记录:

public bool IsInRange(Vector2 currentTarget)
{
    if ((currentTarget.X >= PosX - BRadius && currentTarget.Y >= PosY - BRadius) || // left up
        (currentTarget.X >= PosX - BRadius && currentTarget.Y <= PosY + BRadius) || // left down
        (currentTarget.X >= PosX + BRadius && currentTarget.Y >= PosY + BRadius) || //right up
        (currentTarget.X >= PosX + BRadius && currentTarget.Y <= PosY - BRadius)) //right down
    {
        return true;
    }
    return false;
}

我正在尝试使用XNA框架在c#中做到这一点。

PosX和PosY来自当前gameObject的位置。当前目标现在只是玩家的位置。

如何检查游戏对象是否在特定半径内

我过去使用过Vector2.Distance()来确定游戏对象是否靠近玩家对象。我们可以使用它来返回一个浮点数,并从中我们可以检查游戏对象是否在特定半径内。

如果你特别想看看游戏对象是在玩家的右上方还是左下方,那么不幸的是,这并没有多大帮助。

疑问句:

public bool IsInRange(Vector2 currentTarget) {
    Vector2 yourPos = new Vector2(PosX, PosY);
    return BRadius >= Vector2.Distance(yourPos, currentTarget);
}

你把x和y混在一起了

检查当前目标。X位于PosX两个极端左&正确的。不是左和上。这样想真让我头疼!

我将在伪代码中充实一下。

if(
  (target.x > my.x -radius && target.x < my.x +radius) &&
  (target.y > my.y -radius && target.y < my.y +radius)
){ ... }

注意,这检查的是一个边界框,而不是严格意义上的半径。但在许多情况下,这就足够了。

所以最后应该是:

if (currentTarget.X > PosX - BRadius && currentTarget.X < PosX + BRadius) &&
   (currentTarget.Y > PosY - BRadius && currentTarget.Y < PosY + BRadius)
        { return true; }

根据圆-圆碰撞(这是一个关于球体碰撞检测的冗长讨论)你应该检查x到圆心的距离。如果距离大于半径,则没有问题。只要解(x2-x1)^2 + (y1-y2)^2 <= (r1+r2)^2,假设两个对象都有球形hitbox。