2012-12-20 52 views
1

我正在嘗試SFML並創建經典遊戲Snake。在SFML中移動精靈的Prob看起來很遲鈍(因爲sf :: Clock)

我已經成功地讓蛇在一段時間後移動了一定數量的像素。問題是遊戲循環需要不同的時間來執行。所以,當我寫出來的differtime的一舉一動,它看起來像這樣:

  • 時間:0.273553
  • 時間:0.259873
  • 時間:0.260135
  • 時間:0.396735
  • 時間:0.258397
  • 時間:0.262811
  • 時間:0.259681
  • 時間:0.257136
  • 時間:0.266248
  • 時間:0.412772
  • 時間:0.260008

與0.39和0.41的顛簸並不好。它們使蛇有時候移動得更慢,看起來不太好。

時間應該始終爲0.25,這樣蛇就可以在屏幕上平穩地運行。 這裏是我的代碼是在gameloop實現(snake.getSpeed()函數返回4):

if(_clock.GetElapsedTime() > (1/snake.getSpeed())){ 
     std::cout << "Time: " << _clock.GetElapsedTime() << std::endl; 
     snake.changeDir(keyDown);  //Change direction 
     snake.move();   //Move the snake 
     _clock.Reset(); 
    } 

是處理器只是減緩或做任何有關於如何使代碼更好的另一個想法?

編輯:忽略以上。實時保險槓看起來像GetEvent功能。不知道爲什麼,但需要從0到0.2秒才能執行。這裏是我的測試代碼:

//This is just i bit of code, therefore there's no ending brackets ;) 
    _clock.Reset(); 
    while(_mainWindow.GetEvent(currentEvent)) { 
     std::cout << _clock.GetElapsedTime() << std::endl; //cout the elapsed time for GetEvent 

(該_mainWindow是SF :: RenderWindow的) 不知道這是可以固定的,但我要走了無法解決的問題,如果任何人有一個想法,那麼這是偉大的。謝謝!

+1

這聽起來像你正在尋找以等速移動精靈。這裏有一個相關的談話:http://en.sfml-dev.org/forums/index.php?topic=6284.0簡短的版本是,你應該使用你想要的速度計算蛇的位置乘以所花費的時間自上次更新以來。 –

+0

我已閱讀過此內容,但我不認爲這是我需要的。相反,我每2秒移動蛇。我會在有空的時候看看你的帖子。 –

回答

4

首先,我建議你使用SFML 2,因爲SFML 1.6尚未保持超過25年來,有相當多的已知的和醜陋的錯誤,並從SFML 2.缺乏許多不錯的功能

下一頁它主要是最好不要試圖強制某個幀率,因爲有些因素不能真正做到這一點(操作系統中斷,移動鼠標時發生大量事件等),而是使運動取決於幀速率。 最簡單的方法是使用所述Euler method

pos.x = pos.x*velocity.x*dt 

pos是一個對象的位置的向量,velocity爲二維速度向量和dt是增量時間,即時間在兩幀之間。 不幸的是,簡單的歐拉方法不是很精確,也許Verlet integration可以提供更平滑的運動。

但是,這還不是全部,因爲即使運動現在更緊密地綁定到幀速率,尖峯仍然會發生並導致不必要的影響。因此,最好是修復你的時間步,因此用FPS(每秒幀數)計算的渲染與物理計算無關。對此還有很多方法,我發現有用的一篇文章是that one