当乒乓球拍移动时,帆布球以错误的方向反弹

时间:2014-09-10 14:32:21

标签: javascript html5 css3 dom canvas

我想从一张纸条开始。我尝试使用jsfiddle但由于某种原因HTML5 canvas不起作用。因此,我使用http://jsbin.com/gugihuwegopa/1/作为解决方法。要使用此站点进行编辑,请单击窗口右上角的编辑按钮。无论如何,我的问题是,当球拍没有移动时,球会在所有侧面正确弹跳(nomove变量与此无关,只是为了让它随着“w”键消失)。但是,当我用鼠标朝着球移动球拍时,它会卡在球拍内。我认为这是因为它没有足够快地更新球拍的位置,以至于球在球内部结束,而且我的代码继续导致球在内部反弹。 (直到快速移开桨并且它不会松开)。是的,我已尝试将cxt.fillRect放在cxt.arc()之前。有时球也会穿过球拍。我认为解决这个问题的方法是在我的两个if陈述中考虑球的方向:

if(y+ymove>=w && y+ymove<=w+h && x>=s && x<=s+l ) ymove*=-1; //top and bottom
if(x+xmove>=s && x+xmove<=s+l && y+ymove<=w+h && y+ymove>=w ) xmove*=-1; //left and right

我尝试过的其他一些方法包括:

    if(y+ymove>=w && y+ymove<=w+h && x>=s && x<=s+l && centerY+17.5 < y+ymove+5 && centerX+12.5 < x+xmove+5) ymove*=-1; //top and bottom, extra +5 for radius
    if(x+xmove>=s && x+xmove<=s+l && y+ymove<=w+h && y+ymove>=w && centerX+12.5 < x+xmove+5 && centerY+17.5 < y+ymove+5) xmove*=-1; //left and right

所以基本上我只是需要球才能正确反弹,无论我如何移动球拍。随意编辑您想要的所有内容,即使这意味着添加更多if语句。我要求的绝对不是JQuery。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我建议您更友好地使用您的代码以获取帮助,删除评论并仅保留您需要修复的部分。

关于你的问题,你可以做的一件事就是使用一个标志,如果球击中桨,将标志设置为True,重定向一次并停止检查碰撞,直到标志为假。

当然,应该有一个更好的解决方法,但这是一个开始。

答案 1 :(得分:0)

您必须将碰撞处理视为具有(至少)两个阶段:碰撞检测和碰撞解决。在这里你只能通过改变速度来解决碰撞,但如果一个速度非常高,两个物体可能仍然相交:一个物体可能在另一个物体内部:所以你也要解决位置,或者,如果你更喜欢“推”最强最重的物体。您可以通过在两个对象的x,y,w,h上使用几分钟/最大值来完成此操作。

OR,还有另一种“动态”方法来避免对象重叠:让碰撞处理时间驱动。将碰撞处理拆分为时间子步骤,在每次碰撞时停止。您必须计算下一次碰撞发生的时间,然后将每个人移动到那个时间,然后仅更新速度,并再次执行此操作,直到经过足够的时间。所以甚至不可能发生重叠:你在碰撞时停止观察,然后改变速度,然后重新开始时间。并且在一个帧中可能发生几次碰撞,这种情况不能通过单次通过算法正确处理(当球撞到角落附近时)。  一个例子:说出你的游戏帧时间,'dt'是16毫秒,现在你在10.2ms检测到球击中桨 - &gt;你让两个物体移动10.2ms(x + = vx * 10.2 / y ......),解决它们的速度(仅),然后你要求你的碰撞引擎再循环5.8ms。
这是一个小工作,但我在我的游戏引擎中做到了,它工作正常。

(希望我的帮助比混淆...... :-))