如何检查gameObject是否在特定半径范围内?

时间:2014-05-02 13:56:38

标签: c# xna range collision-detection geometry

我在检查游戏对象是否在与玩家相比的特定半径范围内时遇到了困难。

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

这是我到目前为止所做的:

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他的位置。而currentTarget现在只是玩家的位置。

3 个答案:

答案 0 :(得分:1)

你正在混合你的x和y。

检查currentTarget.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; }

答案 1 :(得分:1)

我过去曾使用Vector2.Distance()来判断游戏对象是否在玩家对象附近。我们可以使用它来返回一个浮点数,从中我们可以检查游戏对象是否在一定范围内。

如果您特意想要查看游戏对象是否位于玩家的右上角,左下角等,那么这将无济于事。

答案 2 :(得分:0)

根据circle-circle collision(这是关于球体命中检测的冗长讨论) 你应该检查距你的cirlce中心x的距离。如果距离大于半径,你没事。只要解决(x2-x1)^2 + (y1-y2)^2 <= (r1+r2)^2,只要两个对象都有球形命中框。