这是我在多种语言中遇到的一般问题。当我第一次学习这门语言时,我尝试做的第一件事就是制作一个弹跳球。
然而,每次我这样做时,我都会遇到一个非常烦人的问题 - 球只是在底部弹跳一下。
以下是我在了解Html5 Canvas时遇到的问题示例 - http://pastebin.com/aM1svKMJ
您可以将其复制并粘贴到HTML文件中,并根据需要自行运行。即使我在每次弹跳后都会失去20%的“能量”,但它会在底部继续反弹。
如果有人能指出我的错误,我将非常感激
答案 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会很小,只会向上移动一个像素并将其放回原位,因此它不会移动。
如果你仍然没有解决它,因为你必须改变事件的顺序。