为Topdown Shooterdevise高效的二维碰撞

这是我第一次在这里发布,所以如果我偶然发现亲爱的约定,我很抱歉。

目前,我试图弄清楚如何处理屏幕上大量实体的碰撞(子弹地狱,自上而下的射手)。 我和过去的一些朋友做了一个游戏的原型,我们达到了大约300个循环实体(一个半径为“hitbox”的点),在相当的性能下降之前,每1/60秒检查一次。 实施是值得的, 由于缺乏经验和非常严格的期限,我们没有时间做任何事情,而是与每个实体进行蛮力距离检查,每场循环计算900个毕达哥拉斯计算。

这次我想用一些情报来处理它。 由于我只是在检查碰撞,没有保留任何方向信息,所以我设法提出了两个策略。 不幸的是,他们有他们的好处和缺点:

  1. 本地化检查 – 本质上,创建一个二维数组,并只检查这三个实体存在的单元格。问题是边缘案例成为一个问题 – 例如,如果一个联盟实体位于一个单元格的边缘,而敌方实体在相邻单元的相邻边缘上,我应该同时检查这两个单元,这意味着将会有附加的相邻单元检查。 虽然我可以通过一个强制性的“共享一个顶点的所有单元格”来检查这个问题,并将这个单元格的大小减小到[标准实体半径* 2],但是它限制了实体的大小,或者迫使我使用一个单独的检查系统大于标准的实体。 显然,避免这将是理想的。

    • 更重要的是,虽然这大大降低了在碰撞检测期间进行的计算,但是由于移动而将实体重新分配给另一个单元会在游戏循环的每次迭代期间对所有移动的实体(其中大多数)产生计算步骤。 此外,必须进行额外的调用才能将对象从一个单元格移动到另一个单元格,以便在单元格大小下降时更加常见。 这并不理想
  2. math检查 – 理论认为,如果我们认为子弹模式不是作为独立的实体,而是作为math公式expression为方程(线性,二次等)和正弦函数的交集(根据y位置确定实体的位置在这个函数中) ,检查将被简化为3个实体,而不是所有现有公式的总和。 不幸的是,我缺乏这样的math背景。 此外,devise子弹模式成为一个巨大的头痛,所以devise水平的成本上升(我认为,最昂贵的工作是由人类进行的)。

    • 更重要的是,如果我们采用双曲线这样的基本曲线公式,要保持实体沿着曲线完美的圆形是难以置信的。 如果没有math的掌握,实体在曲线上移动时会出现长方形或夹杂。 这是非常困难的graphics表示,而不dynamic做,这将限制我能够利用的视觉词汇。 也不理想

我不完全确定我想如何继续这个。 有什么想法吗? 我设法错过的标准?

我不能留下评论,但你有没有看过Box2D的碰撞检测? 我不确定你在什么环境下工作,但已经被移植到不同的平台上。 我花了一点时间来学习,但我个人认为这是值得的。

如果你的射速比较高,子弹速度快,目标移动速度相对较慢。 一个简单的优化就是使用你的原始方法,使用一个更大的碰撞圆,代表目标在子弹飞行时间内的最大移动量,并排除每一个未通过进一步物理检验的子弹。 如果很大一部分镜头错过了相当远的距离,这可能会使速度提高一些,而没有更多的代码。