如何检查游戏对象是否在特定半径内
本文关键字:是否 对象 何检查 检查 游戏 | 更新日期: 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。