2013-05-09 83 views
10

一般检测帆布游戏碰撞我使用类似:如何检测快速移动之间的碰撞物体

function collides(a, b) { 
    return a.x < b.x + b.width && 
    a.x + a.width > b.x && 
    a.y < b.y + b.height && 
    a.y + a.height > b.y; 
} 

但这仅检测碰撞如果对象是在帧进行处理的时间接触。如果我有一个精灵,其速度(以像素/帧为单位)大于其路径中障碍物的宽度,它将通过障碍物而不会检测到碰撞。

我该如何去检查精灵和目的地之间的内容?

+1

在每一帧上,检查一个向量与你的精灵速度的长度是否与对象相交。 – 2013-05-09 12:59:18

+2

您可能想考虑在[GameDev.SE]上询问这个问题。 – zzzzBov 2013-05-09 15:57:15

+0

也相关:http://stackoverflow.com/questions/7364884/problem-with-collision-detection-of-a-fast-moving-ball-with-a-racket-controlled – JayC 2013-05-09 18:50:45

回答

2

这通常是一个难题,对于像Box 2D库这样的高质量解决方案来说,这将是有用的。

一个快速和肮脏的解决方案(对对角线移动的物体给出误报) - 检查覆盖物体在当前和以前的框架中的位置的边界框之间的碰撞。

代替a.x使用min(a.x, a.x - a.velocity_x),而不是使用a.x + a.widthmax(a.x + a.width, a.x + a.width - a.velocity_x)

如果正在快速移动的对象是小的(子弹),然后线之间碰撞测试(从原点到原点+速度)和其他物体的盒子。

0

您应该使用移动物体扫描(在更新间隔中)的整个区域作为边界框来检查障碍物。