2011-12-12 67 views
1

我開發一個HTML5的3D FPS類引擎已經看起來相當不錯,但由於這可能是最糟糕的語言選擇之一,使3D有時有明顯的滯後。遊戲編程:刪除運動滯後(跳躍)

予編程運動(WASD)是獨立的繪製速度的,所以有時這是相當不平穩,但其它時候是工作在可接受30+ FPS(取決於當然CPU)。

我不能包住我的頭腦的唯一事情就是跳躍:當前跳躍是通過向下降變量添加一個正常數來完成的(重力總是負的,然後通過碰撞檢測進行校正),然後減去一個常數,這被稱爲每次一個新的框架渲染時,事情是,當fps走低時,我覺得我在月球上。我更喜歡搖晃的效果。

如果我使用與我一樣的移動方法(計算當前幀和最後一幀之間的時間),扣除的變量有時會變得太大,並且跳躍頂點會變化(與高幀率的一半相比) - 這是因爲跳躍高度必須始終相同而不可接受。

下面是一些僞代碼,以幫助理解問題(一個渲染程序中調用):

// when clicked on spacebar: 
if(spacebar) 
{ 
    // this defines jumping apex 
    jump = 0.5 
} 

// constant added to y (vertical position) later in the code 
cy += jump; 

// terminal velocity = -2 
if(jump > -2) 
{ 
    // gravity (apex multiple to get maximum height) 
    jump -= 0.05; 
} 

if(collision_with_floor) 
{ 
    // stop falling 
    cy = 0; 

    if(jump < 0) 
    { 
     jump = 0; 
    } 
} 

player.position.y += cy; 

現在與時間相關的跳躍(在上面的代碼替換):

// terminal velocity = -2 
if(jump > -2) 
{ 
    // gravity, 0.4 is an arbitrary constant 
    jump -= (now - last_frame)*0.4; 
    last_frame = now; 
} 

要說明甚至更好這裏是一個正在發生的事情的圖像:

enter image description here

藍點表示幀渲染。

我甚至不能肯定這是編程跳躍例行的正確途徑。基本上不平順和不斷的跳躍高度比平滑和慢搖效果要好。

回答

0

如果幀更新即將太慢,無法得到準確的物理,那麼也許你可以在跳頂點破解這樣玩家總是擊中它。這裏的提示可能是y速度從正變爲負時。如果我在讀你的僞代碼的權利,那麼它看起來像:

old_cy = cy; 
cy += jump; 
if(old_cy > 0 && cy <= 0) 
    player.position.y = jump_apex_height; 

在你的圖來看,這個想法是,要確定藍點到達橙色線,再撞起來的虛線。

而現在,我想它,如果玩家真的每次達到頂點跳,那麼這可能會幫助甚至是高利率的更新。

+0

這樣做很有效,但並不理想,如果我在碰到頂點時將橙色線撞到虛線上,它會變得非常不平穩,就像是第二次小跳躍。在較低的fps上它不是很明顯,但在更高的時候它很煩人。 – Solenoid

+0

奇怪的是,較高的FPS更糟糕 - 我會認爲理想頂點和實際頂點之間的距離會低於較低的FPS。如果玩家缺乏虛線,可能不是突然出現碰撞,只是保持當前的'cy'爲正值,以便玩家繼續向上直到達到它。 –

+1

此外,這是一個有趣的問題,但它可能在http://gamedev.stackexchange.com/獲得更多的牽引力比SO。 –