2015-11-03 103 views
2

我製作了一個非常簡單的引擎,它基本上繪製了一個角色,然後您可以在屏幕上移動它。GLUT中的平滑運動

但我確實在相當可怕的方式運動,我的意思是它是基於這樣的離散值:

void Scene::movePlayer(int dir) { 

    switch (dir){ 
    case 1:  yy = yy + 0.05; 
      break; 

    case 2:  xx = xx - 0.05; 
      break; 

    case 3: 
      yy = yy - 0.05; 
      break; 

    case 4: 
      xx = xx + 0.05; 
      break; 

    default: 
      break; 
} 

其工作和運動的性格,但我真的不喜歡它,因爲它是非常跳躍,並且不光滑。

我喜歡更流暢的動作,就像在馬里奧或類似的東西。

你能告訴我如何做到這一點嗎?

+0

您是否正在考慮*加速/減速*,而不是現在的離散「停止/移動」? – usr2564301

+0

這將是很好,但它不是我目前的重點。 基本上現在,0.05值會在兩個位置之間產生顯着的「跳躍」,這很容易察覺。當我減小此值時,運動更平滑(因爲跳躍要短得多),但也會使角色移動得慢得多(因爲要移動設定距離需要更大量的「跳躍」。) 我不知道如何平衡它,這樣角色就可以在屏幕上合理快速移動,但它也會使它變得非常小,所以看起來很平滑。 – Macko

+0

這是一個幀率問題。幀速越快,在同一時間段內從A到B的移動步長就越小。那麼如何檢測角色應該移動並重繪場景? – Robinson

回答

1

你在做什麼之後是加速(也許還會減速 - 讓我在回答時考慮一下)。

遵循的步驟是這些:

  1. 您的馬里奧是站在仍處於x位置。將speed設置爲0.0acceleration爲較小的值,例如0.01
  2. 用戶按下左側右側鍵。將acceleration添加到speed並更新他的位置。確保加速度具有正確的符號 - 向左移動爲負值,向右移動爲正值。
  3. 只要用戶沒有釋放密鑰,請繼續添加accelerationspeed - 但是隻要speed達到合適的值就會停止(例如,您的0.05)。
  4. 如果你想馬里奧幻燈片停頓鍵被釋放時,設置acceleration爲負值(加速時通常超過),並用它來下降的速度,直到它如少-0.015或等於0.0。當它更少時,請務必將其重置爲,正好是0.0!浮點操作不準確,剩餘的非常小的值可能會讓你的馬里奧保持輕微移動。

此程序是強烈地將與您整個遊戲循環的實際時間聯繫在一起。你需要每場比賽只增加或減去acceleration一次。
可以使其以可變的更新間隔工作(即根據兩個連續的speed更新之間的時間調整速度),但以固定幀速率(例如25或50幀每秒)開始更容易。這樣acceleration可以是恆定的;正確的價值可以通過試運行估算。我想你最終會通過你的xx = xx + 0.05;這樣的過程。

相同的程序可以用於「跳躍」和「下降」。要跳躍,請將初始速度設置爲較高值,並在每個遊戲循環中將其降低。不要擔心,如果它低於0,這是必須有什麼上漲再次下降。要下降,請將速度設置爲0.0,並再次使用acceleration增加它。

如果你的馬里奧沿無限直線移動,這將工作正常。然後你只需要留意他的yy位置 - 它可能不會延伸到「樓層」以下。如果您要添加不同的垂直水平以繼續前進,則可以爲左右移動(使其停止而不是停止滑動)和上下移動(再次,停止停止)添加碰撞檢查如果他跳起來,把頭撞到某個東西上,但隨後會「摔倒」,如果他離開某物,速度會加快,直到他碰到底部的一個塊)。

+0

非常感謝您的幫助。你能告訴我如何限制我的程序中的幀率?到目前爲止,它在我的全新遊戲電腦和真正舊的弱電筆記本電腦上運行相同,所以我想現在它不是一個真正的大問題,但我希望知道將來的參考。 – Macko

+0

我能想到的最簡單的方法是使用'glutTimerFunc' - 將速度和位置更新放在其回調函數中。一個'msecs'的值爲40(見[它的描述](http://linux.die.net/man/3/gluttimerfunc))應該給你一個大約25fps。 – usr2564301