2D平铺/基于时间的碰撞检测

时间:2014-01-13 22:52:05

标签: javascript html5 2d collision-detection requestanimationframe

我目前正在创建一个基于2D平铺图的塔防游戏。

游戏循环基于HTML5-API requestAnimationFrame,因此我使用基于时间的动画。

现在,问题是,如何有效地检查碰撞?如果三角洲太高,子弹可能会跳到敌人身后而不会引发碰撞。 每个子弹和敌人都可以有不同的移动速度。

我到目前为止找到的唯一可能的解决方案是实施一个“固定时间步物理”,感觉有点笨拙。还有其他解决方案吗?

我想一些适合这种主题的关键字/算法已经有很多帮助了!

3 个答案:

答案 0 :(得分:0)

在每个更新周期中绘制一条跟随子弹轨迹的线。同时为可能使用相同方法移动的任何目标绘制一条线,如果线相交则发生碰撞(也检查静止目标)。

即。将线条的向量设置为每个更新周期的项目符号lastPosition的项目符号currentPosition,测试此线段沿着其路径的每次碰撞更新。

答案 1 :(得分:0)

以Matthew Pigram的回答为基础:

除了画线as illustrated by Lizzaran92和测试交点外,还需要计算该帧内交点的“时间”,以避免错误碰撞。

例如,如果两条线都以线性速度运行,如果线A与线的50%相交而线B以20%相交,那么它们可能永远不会相撞。您可以设置阈值,例如相互之间的10%,以表示发生碰撞。

答案 2 :(得分:0)

其他答案指向正确的方向。您可以使用线交叉方法。在大多数情况下,它是enaugh,因为这种“错误的碰撞”和真正的碰撞之间的差异很小。但是,如果你看到它似乎没有现实。你可以使用交叉点。

你有2个物体,有速度,两者的起点和终点。有了这些信息,您可以:

  1. 计算交点。
  2. 计算起点和交点之间的距离(d²=(x1 - x2)²+ (y1 - y2)²)。
  3. 除以你的速度,你有时间,什么时候     它到达交叉点。
  4. 对另一个对象执行相同的操作。
  5. 比较2次,或者更好地建立差异并使用a     公差(导致对象也有一个大小,你可以忽略它     计算):
  6.   

    如果差异小,那么您的容差就会发生碰撞   发生了。

    请注意,这可能对性能有害,所以只有在真的有必要时才使用它!