Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.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_Jquery_Canvas_Createjs - Fatal编程技术网

Javascript 如何检测碰撞

Javascript 如何检测碰撞,javascript,jquery,canvas,createjs,Javascript,Jquery,Canvas,Createjs,我正在做一个基于本教程的小游戏 我做了些改变,但这条线有问题 if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75) if(ball.x player.x&&ball.y>=player.y&&ball.y=player.y&&ball.y=player.y&&ball.y

我正在做一个基于本教程的小游戏

我做了些改变,但这条线有问题

if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75)
if(ball.x player.x&&ball.y>=player.y&&ball.y
每当用户从左侧或右侧快速击球时,即使在教程中,球也会不断反弹,错误就在那里,有人能帮我吗


谢谢

我想这是因为球出于某种原因进入太远了,它有多个
*=-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');
}
if(ball.x player.x&&ball.y>=player.y&&ball.y
这样我们就可以确保球在酒吧里的时候就出来了


**编辑了你发布的链接中的代码。

我认为这是因为球出于某种原因进入太远,它会执行多个
*=-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');
}
if(ball.x player.x&&ball.y>=player.y&&ball.y
这样我们就可以确保球在酒吧里的时候就出来了


**编辑了您发布的链接中的代码。

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

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

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


您应该再添加一个条件,即
xSpeed我已经为您的问题找到了正确的解决方案


您应该再添加一个条件,即
xSpeed在2D中检测碰撞的主要方法有两种:

  • 逐像素。只有在形状复杂的情况下才应该使用此方法,因为此算法具有O(高度*宽度)复杂性,其中高度和宽度是以像素为单位的较小精灵的大小
  • 通过公式。如果可能,您应该始终使用此方法。这通常会导致O(1)复杂性
在你们的例子中,球是圆的(很明显),球员是长方形的,我想


回答了“如何通过公式检查矩形和圆形是否相交?”的问题。

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

  • 逐像素。只有在形状复杂的情况下才应该使用此方法,因为此算法具有O(高度*宽度)复杂性,其中高度和宽度是以像素为单位的较小精灵的大小
  • 通过公式。如果可能,您应该始终使用此方法。这通常会导致O(1)复杂性
在你们的例子中,球是圆的(很明显),球员是长方形的,我想


回答了问题“如何通过公式检查矩形和圆形是否相交?”的答案。

嗯,如果问题是“太快”的球会进入挡板内部,您有三个选择:

  • 用数学方法进行碰撞测试,即计算球在当前时间段内是否会划出一条线穿过桨叶
  • 使时间步长变小(以较小的增量移动球,并检查每一步的碰撞)
  • 使时间步具有适应性,这样当物体速度变快时,时间步会变小,并且无论速度如何,球在每个时间步上的移动量大致相同
      嗯,如果问题是“太快”的球会进入球拍内部,您有三种选择:

      • 用数学方法进行碰撞测试,即计算球在当前时间段内是否会划出一条线穿过桨叶
      • 使时间步长变小(以较小的增量移动球,并检查每一步的碰撞)
      • 使时间步具有适应性,这样当物体速度变快时,时间步会变小,并且无论速度如何,球在每个时间步上的移动量大致相同
      我不太清楚问题出在哪里-是不是因为球员没有击中,球不应该反弹?如果您尝试教程中的演示,当您从边缘击球时,球会反弹多次,看起来像是它的绊脚石。您的代码行将正确确定球是否在球员的桨内。但是如果球跑得足够快,它就会在你测试碰撞之前通过球拍。@markE是的,这就是发生的事情,有什么我可以解决的吗?看这篇文章,我不太确定我是否理解问题所在-是不是球在不应该因为球员失误而反弹?如果你尝试教程中的演示,当你从边缘击球时,球会反弹几次,看起来像是它的绊脚石。你的代码行将正确地确定球是否在球员的桨内。但是如果球跑得足够快,它就会在你测试碰撞之前通过球拍。@markE是的,这就是发生的事情,有什么我可以解决的吗?看到这篇文章了吗