简单的弹跳球不会停止弹跳

时间:2011-04-21 22:21:16

标签: javascript html physics

这是我在多种语言中遇到的一般问题。当我第一次学习这门语言时,我尝试做的第一件事就是制作一个弹跳球。

然而,每次我这样做时,我都会遇到一个非常烦人的问题 - 球只是在底部弹跳一下。

以下是我在了解Html5 Canvas时遇到的问题示例 - http://pastebin.com/aM1svKMJ

您可以将其复制并粘贴到HTML文件中,并根据需要自行运行。即使我在每次弹跳后都会失去20%的“能量”,但它会在底部继续反弹。

如果有人能指出我的错误,我将非常感激

6 个答案:

答案 0 :(得分:3)

你可以使用球的原始y坐标并使用其与当前y坐标的比率来减小“e”除以灵敏度的常数。 适合我:

//line 46 add:
var initHeight = height / 2;

//line 83:
this.vy *= -1 * e;
e = e - (e* (initHeight / this.y ) / 10);

这是一个工作样本:http://jsfiddle.net/57tx3/

答案 1 :(得分:1)

如果你继续除以20%,你将永远不会达到零。最终,你会“蹦蹦”20%的一些无限小的数字。当它达到原始数量的最低百分比(例如20%或更低)附近的“能量”时,你将不得不将其硬编码为0%。

或者更好的是,每次反弹都需要除以原始数量的20%,而不是当前数量。这只会是5次反弹,但是你说它是5%,那是20次反弹直到零。

答案 2 :(得分:1)

你也可以在每次弹跳时扣除少量能量(可以固定,可以随机选择)。在某些时候,这将主导计算,并将你的能量归零。

答案 3 :(得分:1)

我在修补它之后自己解决了这个问题。

一旦按照正确的顺序采取了必要的步骤,结果一切正常。

这意味着应首先添加加速度,然后添加速度,然后对图形进行位置检查。

我需要改变的是

                                        this.vx += this.ax;
                                    this.vy += this.ay;

                                    this.x += this.vx;
                                    this.y += this.vy;

答案 4 :(得分:0)

这是一个非常常见的问题,但大多数答案似乎并没有解决实际问题:你有恒定的重力加速球,但你只有与地面接触时的比例减速。这意味着当球足够慢时,球会获得能量:球从重力中获得速度,从而使球穿过地面。你检测到并将球移回地面,但是然后你反转速度(只取出它从重力中获得的部分)。所以球稍微跳了起来。您需要检测resting contact

答案 5 :(得分:0)

要解决这个问题,我唯一需要做的就是改变切球后把球放到哪里。

不要把它放在屏障之上,而是把它放在屏障上。

if ball.py >= surface.get_height() - self.radius:
    ball.sy = - ball.sy * ball.elasticity
    ball.py = surface.get_height() - self.radius - 1

正如你所看到的,它仍会检测下一帧的碰撞,因为vy会很小,只会向上移动一个像素并将其放回原位,因此它不会移动。

如果你仍然没有解决它,因为你必须改变事件的顺序。