Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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_Html_Physics - Fatal编程技术网

Javascript 简单弹跳球获胜';不要停止跳动

Javascript 简单弹跳球获胜';不要停止跳动,javascript,html,physics,Javascript,Html,Physics,这是我在许多语言中遇到的一个普遍问题。当我第一次学习这门语言时,我尝试做的第一件事就是做一个弹跳球 然而,每次我这么做,我都会遇到一个非常恼人的问题——球只是在底部不断地反弹 下面是我今天在学习Html5画布时遇到的一个问题示例- 您只需将其复制并粘贴到HTML文件中,然后自己运行即可。即使我设定它在每次反弹后损失20%的“能量”,它仍然会在底部反弹一点 如果有人能指出我的错误,我将不胜感激。如果你一直除以20%,你永远不会达到零。最终,你将“反弹”一些无穷小的数字的20%。当它达到接近原始量的

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

然而,每次我这么做,我都会遇到一个非常恼人的问题——球只是在底部不断地反弹

下面是我今天在学习Html5画布时遇到的一个问题示例-

您只需将其复制并粘贴到HTML文件中,然后自己运行即可。即使我设定它在每次反弹后损失20%的“能量”,它仍然会在底部反弹一点


如果有人能指出我的错误,我将不胜感激。如果你一直除以20%,你永远不会达到零。最终,你将“反弹”一些无穷小的数字的20%。当它达到接近原始量的底部百分比(比如20%或更低)的“能量”时,您必须将其硬编码为0%


或者更好的是,每次反弹都需要除以原始金额的20%,而不是当前金额。这将只有5次反弹,但假设你将其设为5%,即20次反弹到零。

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

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

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

这是一个工作示例:

您还可以在每次反弹时扣除少量能量(可以是固定的,可以随机选择)。在某一点上,这将主导计算,并使你的能量为零。

我自己解决了这个问题,在对它进行了一点修补之后

一旦按正确的顺序采取了所需的步骤,一切都会好起来

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

我需要改变的只是

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

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

这是一个相当普遍的问题,但大多数答案似乎并没有解决实际问题:你有恒定的重力加速球,但你只有比例减速从接触地面。这意味着当球速度足够慢时,它正在获得能量:球从重力中获得速度,重力将使球穿过地面。你检测到了这一点,并将球移回地面,但然后你将速度反转(只取出它从重力中获得的一部分)。所以球往上跳了一点。你需要检测。

要解决这个错误,我唯一要做的就是在冲突后改变我把球放在哪里

你不是把它放在障碍物上,而是把它放在障碍物上

if ball.py >= surface.get_height() - self.radius:
    ball.sy = - ball.sy * ball.elasticity
    ball.py = surface.get_height() - self.radius - 1
如您所见,它仍然在下一帧检测碰撞,因为vy非常小,它只向上移动一个像素,然后将其放回原处,这样它就不会移动


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

每次删除20%不会让“反弹”减少到零;它只是接近于零,每次减少的大小都会变小。理想情况下,当反弹低于某个特定(任意小)值时,您只需将其四舍五入到零,而不是进一步减少20%。@David,在浮点运算的离散世界中,这不需要取决于底流的处理方式。引入您提到的增量的另一种方法是检查值是否已更改:
while(y
,它处理向下舍入下溢的情况(y将达到零,在此情况下
0>=0
),以及值始终保持为正的情况。否,需要对当前金额进行削减。球不“知道”它以前的状态;重要的只是当前的状态。顺便说一句,你的论点让我想起:)球现在可以通过分配两个变量来改变它以前的状态。一个用于当前状态,一个用于前一个状态。然后,每次循环通过“反弹”时,只需使用y-=x。或者更简单地说(而且动态性更小),你使用一个变量作为当前值,然后简单地减去20的倍数,直到达到0。对不起,我没有读到你的答案,但从物理上讲,根据当前的能量量进行减少更有意义。我同意。这是我很快写的一些代码。虽然不太熟悉HTML5,但希望它是相关的。对于(x=100;x=我不同意。当速度是无穷小的时候,球会停下来,这就是我想要的。我不在乎球是否还有无穷小的速度。如果我设置重力(ay)但是,到0时,问题就不存在了。随着时间的推移,球会明显停止。谢谢你的帮助,但我认为你解决问题的方法是错误的,我仍然不理解为什么我的代码不起作用。即使在100次反弹后,球在应该是[0.8^100]时也不会反弹得更低初始速度,非常小。问题在于重力。如果我把重力设为0(ay),那么球会逐渐停止,或者至少实际上停止。这个“把戏”是什么意思?他为什么要这样做?正确的顺序是“更新y”->“检查是否反弹”->“更新vy”。因此,您所写的内容或只是在检查反弹块之后移动“this.vy+=this.ay”都将起作用。