如何检测碰撞

时间:2014-06-09 07:27:29

标签: javascript jquery canvas createjs

我正在根据本教程http://code.tutsplus.com/tutorials/learn-createjs-by-building-an-html5-pong-game--active-11845

做一个小游戏

我做了我的更改,但这条线路有问题

if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75)

每当用户从左侧或右侧快速击中它时,即使在教程中,球也会保持弹跳,但是有错误,有人可以帮我吗?

由于

5 个答案:

答案 0 :(得分:3)

我认为最简单的解决方案是向球添加方向变量并进行测试。如果它是朝向玩家做检查你已经编码,否则忽略。如果检查通过,则在玩家拦截它时改变方向。然后当它反弹时,再次改变方向。这也将大大简化您的代码并减少正在进行的检查次数。

答案 1 :(得分:2)

我为您的问题找到了正确的解决方案

你应该再添加一个xSpeed<0条件,以便if语句更改为如下所示

if(xSpeed<0 && ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75 )
{
    xSpeed *= -1;
    SoundJS.play('hit');
}

我在测试代码后给了你这个解决方案。

答案 2 :(得分:1)

我认为这是因为球由于某种原因进入太远而且它会进行多次*= -1;运行。

因此您应该测量距离并将其恢复,然后*= -1

代码就像这样:

if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75)
{   
    ball.x += ball.x-player.x;
    xSpeed *= -1;
    SoundJS.play('hit');
}

所以我们可以确保球在杆内时球出来。

**来自您发布的链接的编辑代码。

答案 3 :(得分:1)

在2D中检测碰撞有两种主要方法:

  • 逐像素。只有在形状复杂时才应使用此方法,因为此算法具有O(高度*宽度)复杂度,其中高度和宽度是较小精灵的大小(以像素为单位)。
  • 按公式。您应该尽可能使用此方法。这通常会导致O(1)复杂性。

在你的情况下,球是圈(显然),玩家是矩形,我想。

回答问题“如果矩形和圆相交,如何通过公式检查?”得到了答复here

答案 4 :(得分:0)

嗯如果问题是&#34;太快&#34;球将进入桨内,你有三个选择:

  • 用数学进行碰撞测试,即。计算在当前时间步长期间球是否将通过桨划线。
  • 使时间步长变小,即以较小的增量移动球并且每一步都进行碰撞检查。
  • 使时间步长具有适应性,因此当物品变得更快并且每个时间步长球移动大约相同的量时它会变小,而不管它的速度如何。