一般来说,为了检测帆布游戏中的碰撞,我会使用以下内容:
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;
}
但是,如果在处理帧时对象正在触摸,则这仅检测冲突。如果我有一个精灵,其速度(以像素/帧为单位)大于其路径中障碍物的宽度,它将通过障碍物而不会检测到碰撞。
我如何检查精灵和目的地之间的内容?
答案 0 :(得分:2)
这通常是一个难题,对于高质量的解决方案,像Box 2D库这样的东西会很有用。
快速而肮脏的解决方案(在对角移动的对象上产生误报) - 检查覆盖当前和之前帧中对象位置的边界框之间的碰撞。
而不是a.x
使用min(a.x, a.x - a.velocity_x)
,而不是a.x + a.width
使用max(a.x + a.width, a.x + a.width - a.velocity_x)
等。
如果快速移动的物体很小(子弹),则测试线(从原点到原点+速度)和其他物体的框之间的碰撞。
答案 1 :(得分:0)
您应该使用移动物体扫描的整个区域(在更新间隔中)作为边界框来检查障碍物。