2013-07-01 91 views
1

我目前正在處理一個處理草圖,特點是非常基本的重力模擬(基於Daniel Schiffman的書「學習處理」中給出的一個例子),但我的重力一直以奇怪的方式表現,而我在失去知道該怎麼做。這是我能想出的最簡單的例子:重力模擬去幹擾

float x = 50; 
float y = 50; 

float speed = 2; 
float gravity = 0.1; 

void setup() { 
    size(400, 400); 
} 

void draw() { 
    background(255); 

    fill(175); 
    stroke(0); 
    ellipseMode(CENTER); 
    ellipse(x, y, 10, 10); 

    y = y + speed; 
    speed = speed + gravity; 

//Dampening bounce effect when the ball hits bottom 
    if (y > height) { 
    speed = speed * -0.95; 
    } 
} 

以上是幾乎相同什麼史基佛曼的書放在一邊,從不同的起始速度和不同的窗口大小的。對於前兩次反彈似乎工作正常,但在第三次反彈時,球粘在窗口底部。

我不知道從哪裏開始嘗試調試。任何人都可以提供任何指針?

+2

它碰到底部後,嘗試改變y,以便它「在界限內」 – Tom

回答

1

如果y仍然大於height,那麼您的代碼會一直翻轉speed而不會讓球有機會反彈。無論球在邊界還是邊界,都希望球離開邊界。

+0

當然,你是絕對正確的。我現在正在拍額頭。一個簡單的'y = height;'在反彈之後就可以做到。 – patabongo

1

將y設置爲(如果y>高度)塊的高度有幫助,但球永遠不會「休息」(完成時坐在底線上)。
有兩個問題Shiffman的榜樣5.9這是你可能開始:
1)Y可以變得比(高度+速度),這使得它似乎去轟的一聲在地面或反彈瘋狂
更大 - 固定與建議
2)更新Y並事情在錯誤的順序,使球沒有出現,休息 正確的順序算法是:

  • 如果是時候「反彈
    • 否定速度包括潤溼(* 0.95)
    • 組y以的 '地'
  • 添加位置重力加速
  • 添加速度爲y

這樣,當它是彈跳的時候(y>高度),並且速度爲正值(向下)時:
速度設置爲負值(倍數衰減)
y設置爲高度
速度是通過將(仍然爲負)設置由重力因子
ý少負由不太積極的加速

在我的例子,我不想對象消失,所以我使用可變命名爲「限制」爲對象中心的最低(最正y)位置。

float x = 50; 
float y = 50; 

float speed = 2; 
float gravity = 0.1; 

void setup() { 
    size(400, 400); 
    y = height - 20; 
} 

void draw() { 
    background(255); 

    fill(175); 
    stroke(0); 
    ellipseMode(CENTER); 
    ellipse(x, y, 10, 10); 

    float limit = height - (speed + 5); 

//Dampening bounce effect when the ball hits bottom 
    if (y > limit) { 
    speed = speed * -0.95; 
    y = limit; 
    } 
    speed = speed + gravity; 
    y = y + speed; 
}