簡體   English   中英

簡單的彈跳球不會停止彈跳

[英]Simple Bouncing Ball won't stop bouncing

這是我在多種語言中遇到的一個普遍問題。 當我第一次學習語言時,我嘗試做的第一件事就是做一個彈跳球。

但是,每次執行此操作時,我都會遇到一個非常煩人的問題-球只會在底部不斷彈跳一點。

這是我今天在學習Html5 Canvas時遇到的問題的示例-http: //pastebin.com/aM1svKMJ

您可以將其復制並粘貼到HTML文件中,然后根據需要自行運行。 即使我設定每次反彈后都會損失其“能量”的20%,但它在底部仍會繼續反彈一點。

如果有人指出我的錯誤,我將不勝感激

您可以使用球的原始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/

如果繼續除以20%,您將永遠不會達到零。 最終,您將“反彈”一些無限小的數字。 當它達到原始量最低百分比(例如20%或更低)的“能量”時,您必須將其硬編碼為0%。

甚至更好的是,每次反彈都需要除以原始金額的20%,而不是當前金額。 那只會是5次彈跳,但要說成5%,那就是20次彈跳直到零。

您還可以在每次彈跳中扣除少量能量(可以固定,可以隨機選擇)。 在某個時候它將主導計算,並使您的能量為零。

我修補了一下之后,自己解決了這個問題。

事實證明,以正確的順序采取了必要的步驟后,一切正常。

這意味着應首先添加加速度,然后添加速度,然后添加位置檢查,然后添加圖形。

我需要改變的是

                                        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太小了,它只能向上移動一個像素並將其放回原處,因此它不會移動,因此它仍然可以檢測到下一幀的碰撞。

如果仍然無法解決問題,那是因為您必須更改事件的順序。

這是一個非常普遍的問題,但是大多數答案似乎都沒有解決實際問題:您不斷用重力使球加速,但是與地面的接觸只有一定比例的減速。 這意味着球在足夠慢的速度下會獲得能量: 從重力中獲得將其帶到地面的速度。 您檢測到該球並將球移回地面,但隨后反轉了速度 (僅將其從重力中獲得的一部分拿走了)。 所以球跳了一點。 您需要檢測靜止的接觸

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM