2017-08-11 80 views
3

對於Jump'n'Run比賽不同,我試圖做一個跳躍,我發現這個功能。 的問題是,幀率(time_diff)是系統的不同所以有時它如實施例1,有時是10跳轉功能 - 高度幀率

現在,這個功能將基於幀速率

public void jump() { 
    ySpeed = -100; 
} 

// time_diff is time difference between this and last frame 
public void update(double time_diff) { 
    y = y - ySpeed * time_diff; 
    ySpeed = ySpeed + 9.81 * time_diff; 
} 
導致我的字符跳躍不同的高度

這裏也是幀率4和20的示例(這些值不準確,因爲我除以20它們),但你看到,與幀速率20它跳到更高(進一步)作爲幀速率4.

Jump Image

那麼我怎樣才能存檔它跳躍高度總是不變,不管幀率如何?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 編輯 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

我解決它像這樣蒙山的luk2302幫助:

double remaining_time = 0; 
final double step_size = 4; 

public void jump() { 
    ySpeed = -100; 
} 

// time_diff is time difference between this and last frame 
public void update(double time_diff) { 
    remaining_time += time_diff; 
    while (remaining_time >= step_size) { 
     update_helper(step_size); 
     remaining_time -= step_size; 
    } 
} 

public void update_helper(double time_diff) { 
    y = y - ySpeed * time_diff; 
    ySpeed = ySpeed + 9.81 * time_diff; 
} 
+0

試圖最大化'y'的新價值,反對'y'原值? –

+0

這是講好你的主題:https://www.youtube.com/watch?v=hG9SzQxaCm8 – Andreas

回答

4

關鍵點:幀率絕對不會對物理計算產生任何影響。

你應該做的是確定一個固定的步長像1/100秒,物理步驟。然後,你總是隻執行那些步驟,沒有什麼更多,沒有什麼。積累時間,直到你已經達到了臺階偏移和做多一步,如果你已經積累了太多的時間:

double remaining_time; 
final double step_size; 
public void update(double diff) { 
    remaining_time += diff; 
    while (remaining_time >= step_size) { 
     step(step_size); // perform your actual physics logic 
     remaining_time -= step_size; 
    } 
} 

如果更改step_size計算的變化,但是這是你的遊戲是如何決定的物理工作 - 關鍵是價值在所有運行同一遊戲的客戶端都是固定的。

+0

謝謝,我會試試看,回來報告:-) –

+0

尼斯,再次感謝,剛剛更新了我的問題與我的解決方案... –

+1

@DennisEbner樂於幫助。請注意,您應該只執行一次寫入的邏輯,並覆蓋每個相關物理對象中的階躍函數。經常執行'step',只寫'update'一次。 – luk2302