2013-04-25 146 views
1

测试我的比赛,并在用户和怪物碰撞我希望告警弹出,但没有运气:画布碰撞?

function die() { 

    for (var i = 0; i < monster.length; i++) { 
    if (user.destinationX === monster[i].destinationX && user.destinationY === monster[i].destinationY { 
     alert("die"); 
    } 
    } 
} 
+0

什么你遇到的情况类似于PacMan中的小故障,你可以偶尔在没有死亡的情况下直接穿过幽灵行走,也就是说,期望位置相等,而不是检查它们之间的距离是否太近 – 2013-04-25 14:38:05

回答

0

不要使用严格的比较。由于帧率可能不同。你现在正在检测像素的碰撞。您应该考虑每个对象的形状

+0

@Kolink我在添加,不是编辑。看区别? – karaxuna 2013-04-25 14:40:05

+0

真的吗?你点击一个“添加”按钮吗?或者是“编辑”按钮? – 2013-04-25 14:40:29

+3

你好孩子:D – karaxuna 2013-04-25 14:43:35

2

尝试这种碰撞检测方法。它基于两个对象的重叠来检测两个对象之间的碰撞。

function hasCollision(object1, object2) { 
    if (object1.x + object1.width < object2.x) return false; 
    if (object1.x > object2.x + object2.width) return false; 
    if (object1.y + object1.height < object2.y) return false; 
    if (object1.y > object2.y + object2.height) return false; 
    return true; 
} 

function die() { 
    for (var i = 0; i < monster.length; i++) { 
    if (hasCollision(user, monster)) { 
     alert("die"); 
    } 
    } 
} 

该碰撞检测考虑了两个对象是否重叠的对象(方形/矩形),并检查的形状。它还需要对象的宽度和高度来确定对象边缘的位置(或者您可以根据当前的内容对其进行修改)。

+0

请不要只是在没有任何解释的情况下发布代码 – 2013-04-25 14:44:38

+0

@Kolink对不起。实际上是在进行一些解释的过程:) – 2013-04-25 14:51:03

3

我将提供一个合并答案和解释。如果您喜欢解释,请拨打karaxunauser2317489

正如Kolink所说,你的问题在于pacman小故障,或者说,你的怪物不仅仅是像素 - 它们有自己的大小。您目前正在检查一个对象的来源,并查看它是否与另一个对象完全相同 - 如果有的话,这种情况很少会发生。相反,你需要检查的是怪物是否至少有一个共同点(换句话说,碰撞检查)。

这可以通过检查一个的原点是否在另一个的边界框内,或者换句话说,如果monster2.x <= monster1.x <= (monster2.x+monster2.width)monster2.y <= monster1.y <= (monster2.y+monster2.height)来进行。 Arnelle Balane没有提供解释的代码就是这样做的。

这并不总是一个很好的近似值,因为它一味地假设你的怪物是一个正方形。要使它成为一个圆圈,你需要检查一个怪物的中心是否在另一个中心的一定距离内(其中距离是公制的,并且使用sqrt(pow(x,2)+pow(y,2))计算,所有这些都是更精细的细节,但是