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

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

像这样的东西:



右侧的花花公子没有被击中,但底部的花花公子被击中了,我用灰色填充了击中区域,用绿色填充了隐藏的区域...

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

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

谢谢

最佳答案

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

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

使用2D向量的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/

10-09 13:23