Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 二维平铺/基于时间的碰撞检测_Javascript_Html_2d_Collision Detection_Requestanimationframe - Fatal编程技术网

Javascript 二维平铺/基于时间的碰撞检测

Javascript 二维平铺/基于时间的碰撞检测,javascript,html,2d,collision-detection,requestanimationframe,Javascript,Html,2d,Collision Detection,Requestanimationframe,我目前正在创建一个基于2D tilemap的塔防游戏 游戏循环基于HTML5-API requestAnimationFrame,因此我使用基于时间的动画 现在,问题是,我怎样才能有效地检查碰撞?如果三角洲太高,子弹可以跳到敌人身后而不会引发碰撞。 子弹和敌人可以有不同的移动速度 到目前为止,我找到的唯一可能的解决方案是实现一个固定的时间步长物理,这让我感觉有点不舒服。还有其他解决办法吗 我想一些适合这个主题的关键词/算法已经很有帮助了 在每个更新周期中,沿子弹轨迹绘制一条线。还可以使用相同的方

我目前正在创建一个基于2D tilemap的塔防游戏

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

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

到目前为止,我找到的唯一可能的解决方案是实现一个固定的时间步长物理,这让我感觉有点不舒服。还有其他解决办法吗


我想一些适合这个主题的关键词/算法已经很有帮助了

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


i、 e.在每个更新周期中,将线的向量设置为子弹的最后位置到子弹的当前位置,在每次更新时沿其路径测试该线段是否发生碰撞。

基于Matthew Pigram的答案:

除了绘制线和测试交点外,还需要计算该帧内的交点时间,以避免错误碰撞


例如,假设两条线都以线性速度行进,如果a线以50%的速度相交,B线以20%的速度相交,那么它们很可能从未碰撞过。您可以设置一个阈值,例如彼此之间的距离在10%以内,以表示碰撞。

其他答案指向正确的方向。可以使用直线相交方法。在大多数情况下,这种错误的碰撞和真实碰撞之间的差别很小,很难注意到。但如果你看到它看起来不现实,那就让我想想。可以使用交点

有两个对象,分别是速度、起点和终点。有了这些信息,您可以:

计算交点。 计算起点与交点之间的距离d²=x1-x2²+ y1-y2²。 除以你的速度,你就有了时间 它到达了交叉点。 对另一个对象执行相同的操作。 比较两次,或者更好地构建差异并使用 公差会导致对象也有一个尺寸,在中忽略该尺寸 计算: 如果差异较小,则您的公差为碰撞 发生了


请注意,这可能会影响性能,因此只有在确实必要时才使用它

我能想到的方法是沿着子弹的轨迹画一条线。也就是说,在每个更新周期中,将线的向量设置为子弹的最后位置到子弹的当前位置,在每次更新时沿其路径测试该线段是否发生碰撞path@MatthewPigram我已经考虑过类似的方法,但是,只有当目标不移动时,这难道不起作用吗?不,因为你正在沿着一条新线检查每一帧是否有错误collisions@MatthewPigram但是不必以固定的间隔调用每个帧。尽管如此,我还是用这个方法简单地演示了这个问题。看这里:你刚刚在图片中演示了如何解决这个问题,也为你的目标画了一条线!如果两条线相交,则它们发生碰撞!我没有看到这个答案,请看我在我的问题下的评论。是的,这基本上就是线条所做的,它们作为一个阈值,真的很难有效地检测两个快速移动的物体之间的碰撞。如果运动速度以恒定速率加速/减速,您可以计算出每个碰撞的时间点并使用该时间点。