Box2D學習筆記

2021-09-08 00:09:25 字數 3056 閱讀 8814

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

box2d最初是用c++來寫的,之後有被多種語言所實現。

box2d中的核心概念:

剛體:和我們在物理中學習的剛體的概念是一樣的,兩物體之間的距離都是完全不會變化的。不會發生變形。他就是box2d中的body。

形狀:乙個依附於body的幾何結構體,同時具有物理的摩擦(friction)和恢復(restitution)的材料性質。

約束:就是我們所熟悉的自由度

世界:我們所處的真實的世界,包括物體和相互的作用

每個box2d程式都將從乙個世界物件的建立開始。他是管理物件以及模擬的中心。

private function initworld():void

建立世界物件b2world,(1)首先應當建立包圍和盒物件b2aabb。他的大小是越大越好。

因為當剛體碰到包圍盒的邊緣的時候他會停止模擬。

(2)建立世界中的重力場。他是乙個2維的適量b2vec2。

(3)當物體停止移動的時候,讓物體停止模擬。節約資源dosleep。

以上這3個的確定都是初始化world物件所必須的。到此就建立了乙個有一定的大小以及一定的重力場的空間,有了就可以往裡面裝東西了。

建立剛體b2body,

(1)剛體的是由世界物件來建立的

var  body:b2body=this.world.createbody(bodydef);
其中的引數bodydef是b2bodydef建立的,是對body的defination.

var bodydef:b2bodydef=new b2bodydef();

bodydef.position.set(0,4);

他主要是用於初始化剛體在世界空間裡的一些屬性。包括位置(position)、質量(mass)、旋轉角度(angle)等。

現在我們已經建立了乙個剛體,並確定了他在世界空間當中的位置。物體到底是什麼樣的,以及他的物理屬性怎麼樣是我麼馬上就要建立的。

(2)給物體定義形狀以及物理材質

body.createshape(shapedef);
其中的初始引數shapedef是b2shapedef

var shapedef:b2polygondef=new b2polygondef();//

定義形狀為多邊形

2shapedef.setasbox(3,3);//

將多邊形設為矩形

3shapedef.density=1.0;//

定義密度

4shapedef.friction=0.3;//

定義摩擦力

b2polygondef是繼承自b2shapedef

public

class b2polygondef extends b2shapedef

除了b2polygondef外還有b2circledef。

到現在我們的剛體依然是沒的外觀的,對其定義的shapedef也只是對其封裝了一些特殊的屬性而已。

實際上定義剛體外觀的是bodydef(shapedef也有這個屬性)的userdate屬性,他是*型別的。任何型別的物件都可以給他。我們現在需要用它來定義外觀(形狀)就將形狀類或影片類的引用傳給他就可以了。同時需要將userdata加入到舞台的顯示列表當中。

bodydef.userdata = new physcircle();

bodydef.userdata.width = rx * 2 * 30;

bodydef.userdata.height = rx * 2 * 30;

其中的physcircle是sharp類的自定義類。

來自官方的helloworld原始碼:

4 import flash.display.sprite;

5 import flash.events.event;6//

classes used in this example

7 import box2d.dynamics.*;

8 import box2d.collision.*;

9 import box2d.collision.shapes.*;

10 import box2d.common.math.*;

1112

public

class helloworld extends sprite

101//

circle

102else

114 body.setmassfromshapes();

115 addchild(bodydef.userdata);

116 }

117118 }

119120

public function update(e:event):void

131 }

132133 }

134135

public var m_world:b2world;

136public var m_iterations:int = 10;

137public var m_timestep:number = 1.0/30.0;

138139 }

140141}

其中的userdata的物件都是在flash中定義影片剪輯匯出類。

box2d 碰撞過濾

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

BOX2d繪製曲線

來自天地會的 wkyjoey同學 問道如何做乙個重力大師遊戲 如下圖 這裡要特意表示一下歉意,最近一直忙於工作,沒有及時更新教程。對於重力大師遊戲 試玩之後,不難發現,我們在執行時可以建立的剛體有兩種,線條剛體和多邊形剛體。今天我們來一起研究一下線條剛體的建立。多邊形剛體會在下次教程中討論。這裡我們...

box2d之剛體,定製器筆記

剛體 body 通過世界建立的物件,物理引擎裡面所有東西都是剛體 建立方式 定義乙個b2bodydef,b2world呼叫createbody的方法傳入此引數 定製器 fixture 帶有形狀,密度,摩擦力等屬性 建立方式 定義乙個b2fixturedef,呼叫剛體的createfixture方法為...