2011-11-24 64 views
9



重力與通話時間,加速度和速度獲得

我試圖完成重力,其中包括通話時間,也加速。
我一直在使用通常的重力嘗試,它看起來是這樣的:

velocity += gravity * dt; 
position += velocity * dt; 


這可能會工作的正常成熟的遊戲不夠好,但我試圖讓以「直升機遊戲的啓發遊戲「,你必須穿過隧道,而不必接觸牆壁。

我想要做的不同,就是我希望能夠在下降的過程中保存速度,這將在再次使用時加以利用,所以我會在開始時加速。
我也想要某種類型的廣播時間,所以當你點擊頂部時,它不會像你使用代碼示例中的重力一樣快速地強制你。

這張圖片舉例說明了我想要的曲線:
Link to curve

請注意,整個控制是通過一個按鍵完成的,例如,如果您按住空間,則會飛起來,如果您釋放它,則會跳水。
這個角色也不會左右移動,因爲它在屏幕上會有一個靜態的X位置,所以無法使用矢量。

我花了數小時試圖讓它工作,但沒有成功。我也嘗試在互聯網上搜索,但沒有任何運氣。

遊戲「鯨魚之旅」得到了我想要的引力。
這裏是一個遊戲視頻的鏈接:http://www.youtube.com/watch?v=5OQ0OWcuDJs

我不是那麼大的一個物理學家,所以它會很酷,如果你可以給一個實際的代碼
的例子,我希望任何人都可以幫我把這個出。

+0

不是一個壞的問題,但顯示出一些代碼,說明你已經嘗試了什麼對不起BTW - 和*說明如何*這是行不通的 - 會幫助你獲得答案。 :) –

+0

我不是一個物理學家,但我的猜測是,你需要深入一點物理學才能達到你想要的。所以我認爲飛機的物理學應該進入大方向。也許[this](http://www.ucmp.berkeley.edu/vertebrates/flight/physics.html)可以幫助你至少找到正確的詞來尋找解決問題的方法。同樣在最新的蝙蝠俠 - 阿甘市遊戲中,你也有類似的機制,或許值得一試。 – dowhilefor

+0

@djacobson它大部分只是隨機代碼,因爲我不知道該去哪裏,所以它沒有任何好處:) – Basic

回答

4

重力是拉下物體的力量。你的玩家是拉動物體的力量。相應地,您的代碼必須爲:

if(keyPressed) { 
    velocity += POWER_OF_PLAYER; 
} 

velocity += G; 
position += velocity; 

這足以創建一條如您所示的曲線。當然,POWER_OF_PLAYER必須是不同的符號,絕對值必須更大才能使這項工作。

G = -9.81 
POWER_OF_PLAYER = 20 

節省電力是一個簡單的檢查。

if(keyPressed) { 
    if(powerSaved > 0) { 
    velocity += POWER_OF_PLAYER; 
    powerSaved -= SOMETHING; 
    } 
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) { 
    powerSaved += SOMETHING; 
} 

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER應該是小於或等於0。

P.S.我假設你的Y軸從地面開始射向天空。相應的標誌。

+0

我很確定我已經嘗試了這一點,但我會給它與您的代碼去看看它是否有效:) – Basic

+0

這是標準公式,遊戲的物理是不同的。 –

+0

你的數學錯了。重力是一種力量,即它具有單位質量*加速度,而速度隨時間變化的距離單位,所以設置'velocity + = GRAVITY'基本上是不正確的。 – rcollyer

0

它看起來像魚的速度是恆定的。

嘗試以下操作:

velocity是固定的,不能改變(除非魚吃速度電)。 angle = 0相當於平飛。

angle -= gravity * dt; 
if (angle < - Math.PI/2) { 
    angle = Math.PI/2; 
} 
if (keyPressed) { 
    angle += power * dt; 
} 

if (angle < - Math.PI/2) { 
    // Stop the player from doing a looping 
    angle = - Math.PI/2; 
} 
if (angle > Math.PI/2) { 
    // Stop the player from doing an inverted looping 
    angle = Math.PI/2; 
} 
// Move the fish (vertical component of velocity) 
position += velocity * dt * Math.sin(angle); 
// Move the background (horizontal component of velocity) 
background_position -= velocity * dt * Math.sin(angle); 
+0

當使用你的代碼時,玩家只需走直線,除非按下鍵時,它會略微下降。 – Basic

+0

嘗試使角度變化更小 - 'angle - = gravity * dt/100.0;''和angle + = power * dt/100.0;'' –

0

這聽起來像是結合了基於水平速度,並有按鍵按下觸發一個「noseup」運動將工作足夠好「電梯」。

所以lift將是一些恆定k乘以水平速度Vx和垂直速度Vygravitylift倍的變化的差在時間dt

lift = k * Vx 
Vy += (lift - gravity) * dt 

def noseup 
    k = 0.01 #some small chunk 
    dx = k * Vx 
    dy = k * Vy 
    Vx -= dy 
    Vy += dx 

當飛機(或其他)的鼻子它基本上降低了一個軸上的速度,同時增加了另一個軸上的速度。

大概不會是一個壞主意,把drag扔在那裏,現在我想到它,將不得不依賴於絕對速度V = (Vx**2 + Vy**2)**0.5 ...重量是一個比重力更好的詞在這個案例(少混亂,單位明智),但它的作品,我猜。

不完全是「物理」,而是一個近似值,應該可以很好地工作。玩弄k的值,看看你是否可以做到你想要的。

爲超級爛僞代碼:-P