math - 如何计算炸弹的爆炸面积?

标签 math collision-detection computational-geometry game-physics

我正在开发一个游戏,假设玩家在 x=100,y=100 的位置放了一颗炸弹,爆炸半径为 100 个单位......我很容易找到游戏中的所有“元素”被炸弹的爆炸击中(只需要检查他们与炸弹的距离是否低于 100)。

但现在我想考虑我在游戏中的障碍物,障碍物是正方形,总是 64*64 像素,总是与轴对齐(不旋转)..我想知道一个项目是否“隐藏”在后面知道他没有被击中的障碍......

像这样:

enter image description here

右边的家伙没有被击中,但是底部的家伙被击中了,我将命中区域填充为灰色,将隐藏的区域填充为绿色......

我的想法是:
1. 找出场景中距离炸弹距离小于100的所有元素。
2. 找出场景中距离炸弹距离小于100的所有障碍物。
3.计算从元素到炸弹中心的线..然后检查线是否与任何障碍物相交,如果没有..你被击中了。

最后,问题
1. 有没有人有更好的主意?
2. 是否有免费的开源 c# 兼容引擎可以帮助我? Box2d 可以帮我吗?

谢谢

最佳答案

这很简单,正如 Jongware 在评论中提到的,您应该使用两行可见性。

您应该从图片中项目的每个“侧面”计算可见线。每条可见线的原点可以通过计算从炸弹中心开始的线来近似,并获得垂直于该向量的方向。然后,您的两个可见点在法线方向和负法线方向上距离项目中心一个半径处。这种圆形近似可能不能很好地代表所有可能的形状,但对于简单游戏(并且您的项目在绘图中看起来是圆形)通常是一个足够好的近似。

使用二维向量的 Java-isch 伪代码:

// bombCenter and itemCenter are 2D-vectors
bombDirectionVector = bombCenter.minus(itemCenter);
normal = bombDirectionVector.getNormal()    // normal vector of length 1
viewPoint1 = itemCenter.plus(normal.times(itemRadius));
viewPoint2 = itemCenter.minus(normal.times(itemRadius));
// Check obstacle intersection with the lines from viewPoint{1,2} to bombCenter
// ...

然后,可见线将从每个项目侧面的点到炸弹中心。因此,对于每个项目,您检查两条可见线是否与相同的障碍物或两个相连的障碍物相交。

我知道没有免费的开源 C# 兼容引擎可以做到这一点,但唯一可能有点棘手的部分是障碍物交叉检查。因此,如果您只是找到可以帮助您进行交叉检查的东西,那么其余的应该非常直接地实现。

我希望这会有所帮助,如果有任何不清楚的地方,请告诉我,我会相应地澄清答案。

关于math - 如何计算炸弹的爆炸面积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20180152/

相关文章:

python - 在 Python 中应用修正欧拉求解钟摆 ODE

java - 想要提高编程的数学技能

ios - Sprite 套件中的完美弹性碰撞

time-complexity - 计算复杂性和形状嵌套

algorithm - 盒子中所有点对的切线范围

python - math.log(x) 在 Python 中返回意外结果

C++:在 ofstream 文件中写一个双近似值,比如 printf("%f....)

swift - 我如何让两件事相互碰撞,然后从场景中移除一个?

c# - Unity 中的多个触发器

c++ - 如何在 C++ 中绘制多边形以使线条不相交?