OpenGL C++ Circle vs Circle Collision

问题描述:

我正在制作一款2D游戏,并且我创建了两个圈子,一个叫做玩家,一个叫做敌人。通过调用drawPlayerCircle和drawEnemyCircle函数绘制圆,这两个函数都在我的display()函数中调用。目前我的项目不是面向对象的,你可能已经可以说了。我的碰撞适用于两个圈子,因为我已经计算了渗透矢量和归一化矢量等等......但是我的问题是,通过在游戏中拥有10-20个敌人进一步扩展这个游戏,我怎样才能快速地将碰撞提交给每个单一的敌人而不是手动计算我的玩家和游戏中的每个敌人之间的渗透和标准化矢量,这显然非常低效。我猜想我的玩家和敌人实体分成了他们自己的班级,但我仍然在努力想象碰撞如何起作用。OpenGL C++ Circle vs Circle Collision

任何帮助将不胜感激! :)

+0

这是[最接近的一对问题](https://en.wikipedia.org/wiki/Closest_pair_of_points_problem)的变体。 –

+1

由于它是圆形,所以要检测碰撞,只需检查中心之间的距离是否小于r1 + r2。因此,一次检查需要两次减法,三次乘法,两次加法和一次比较。 –

+0

我明白碰撞背后的数学如何与两个圆的半径相互作用'但我的问题是如何以最有效的方式扩大这个,所以我的程序会跟踪玩家和所有敌人之间的距离 –

两个圆圈之间的碰撞非常快速测试。只要检查圆心点之间的距离是否小于两个半径之和即可。

我只是将玩家与其他敌人进行比较而开始。进行20次比较不会对过去10年的任何计算机征税。我非常相信只需编写您现在需要的代码,而不是使事情复杂化,尤其是当您刚刚起步时。

但是,如果您最终拥有数百万个圈子,并且已经对您的代码进行了配置并发现测试所有圈子的速度很慢,则有很多选项。最简单的方法可能是在游戏区域上放置一个网格。

每个网格单元覆盖播放区域上的固定空间量并存储圆形列表。每当一个圆圈移动计算它应该在哪个网格单元格中。将它从当前所在的网格单元格中移除,然后将其添加到它应该在的网格单元格中。然后,只能比较与玩家网格重叠的圆圈细胞。

Space partitioning.具体而言,如果您使用2D,则可以使用quadtree来加速碰撞检测。