Box2D C 教程 跳躍

2021-07-11 22:25:59 字數 2530 閱讀 9314

宣告:本教程翻譯自:box 2d c++ turorials - jumping,僅供學習參考。

水平滾軸遊戲中的角色可以進行跳躍,是吧?現在就讓我們看看幾種不同實現跳躍的方法。我們已經在之前力和衝量(force and impulses)的話題中進行過相關問題的討論,但是現在就讓我們考慮一下如何把這些方法整合到遊戲中。我們可以從勻速運動(moving at constant speed)這個話題開始,在一定範圍內左/右控制移動乙個動態物體。

當玩家跳躍的時候他們的速度就會改變,讓我們以此為起點。首先在keyboard()方法中新增乙個case分支,來獲得玩家的跳躍輸入:23

4567

case

'j':

//jump

break

;

現在按下鍵盤j就會直接改變物體的速度,當然我們知道,這種方式並不是真實世界裡的物理方法。對於橫屏遊戲中的跳躍使用這種方法可能不太合適,這裡有幾點需要注意的地方。首先這樣做物體自身的動量沒有考慮其中,當玩家快速掉落的時候可以用相等的力跳起。玩家可以在半空中進行跳躍-也許這種現象正是你想要的,美其名曰『連跳』特性。接下來我們會解決這個半空跳躍的問題,稍後我們會討論玩家跳躍之後是否著地。

現實生活中,當你真正跳躍的時候,你會在自己身體上施加乙個向上的力,那麼讓我們看看對物體連續幾幀施加強力能否達到此效果。在keyboard()方法中我們將簡單做乙個跳躍開始的標記,在step()方法中完成力的施加。使用乙個類的成員變數來記錄每次的每次應該施加多少幀的力:23

4567

891011

1213

141516

//class member variable

intremainingjumpsteps

;//in constructor

remainingjumpsteps=0

;//keyboard function

case

'k':

//jump

remainingjumpsteps=6

;// 1/10th of a second at 60hz

break

;//in step() functionif(

remainingjumpsteps

>0)

現在嘗試著按下k鍵。和之前類似,但是這次當物體下落的時候,因為下降的動量考慮在內,所以跳躍效果會減小很多。這裡使用的力只是乙個看起來差不多的數值。如果你想指定物體產生起飛(take-off)的速度,需要使用之前推算力矩的公式,根據你想讓物體左/右移動的速度推算出相應的力矩(f=mv/t),在每一幀中對物體施加此作用力:23

4567

8

if

(remainingjumpsteps

>0)

這種方法可能會是你經常用到的,本質上是使用上面相同的力,只在乙個時間步長中完全實現相應的效果。正如之前話題中提到的那樣我們可以忽略時間部分:23

4567

case

'l':

break

;

這種方法比施加作用力更接近直接改變速度的效果,因為每一幀都會有力對物體的作用,重力起到了下降的作用。其實,如果你離近點仔細**,會發現直接使用作用力來實現跳躍並不能和另外兩種方法那樣跳的一樣高。然而,如果你想實現一種緩慢跳起的效果,來取代直接跳起,那麼作用力方法會更有用。

在真實世界裡,每乙個動作都會產生乙個大小相等,方向相反的作用。如果你使用腿推動身體跳向空中,無論你站在**,都會產生乙個相等的向下推力。上面的所提到的方法都沒有把這一點考慮在內,然而大部分遊戲裡也不需要考慮這些。但是如果你需要模擬這種情況,這裡有兩種可以實現的方法,這兩種方法需要我們再多學習一點才能實現,所以現在我只是順帶提一下。

當確定玩家站在什麼物體上之後,如果此物體是動態物體,那麼你應該對此物體施加相同的力/衝量。這就像你站在鞦韆橋(swing bridge)上進行跳躍一樣,比如說,當玩家跳起的時候,橋會瞬間得到乙個取代玩家重力的向下推力。為了達到這種效果,我們需要知道如何告訴玩家接觸到了什麼。

使用稜鏡(滑動)聯結器(prismatic(sliding)joint)把兩個物體連線起來能更快的模擬物體跳躍的效果。使用這種方法,玩家需要擁有乙個主物體,比如我們正在使用的這個,另乙個連線著的是可以上下滑動的小物體。聯結器馬達(joint motor)可以向下推小物體,就像是你用腿進行起跳一樣。這麼做有乙個好的優點是我們不用很麻煩的去檢查,物體到底站在乙個什麼樣的地方,因為如果玩家所站立的下方不能保證『腿』能將身體推向上方,那麼玩家什麼也不發生。此外,如果玩家站立的地方比較『軟』,就像鞦韆橋一樣,那麼玩家的跳起效果將會減小,就像真實世界一樣。當然除了能夠完成更多效果以外,還是會有它自身需要考慮的問題的。我希望這個話題可以放到聯結器以及馬達聯結器講解之後再進行深入**。

你可能已經注意到那個讓被我們看做玩家的物體不停的在一定區域內自由的做旋轉。乙個簡單而又奏效的方法是把物體設定成固定旋轉體:

body

->

setfixedrotation

(true

);

Box2D C 教程 環境設定

宣告 本文翻譯自box2d c tutorial setting up 僅供學習參考。windows linux mac 由於最新的box2d版本,原始碼中針對windows和mac平台中的主流ide vs2010和xcode4 已經進行了整合,所以這裡就不進行翻譯了,再者教程原文中的設定看起來已經...

box2d 碰撞過濾

原帖 碰撞篩選就是乙個防止某些形狀發生碰撞的系統。按照具體需求設定哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。box2d通過種群跟組索引支援碰撞篩選。組索引比較簡單,設定其shapedef的groupindex值即可,例如boxdef.filter.groupindex 1。通過groupin...

Box2D學習筆記

box2d是乙個用於遊戲的2d剛體 庫,程式設計師可以在他們的遊戲裡使用他們,也可以是的自己的物體運動的更可信。讓他看起來更加接近現實。物理引擎是乙個程式性的動畫系統。而不是由動畫師去移動物體。這一切都是建立在牛頓力學的基礎之上。box2d最初是用c 來寫的,之後有被多種語言所實現。box2d中的核...