http://yueguc.iteye.com/blog/575954
在cocos2d要使box2D不難,但必需要遵從一些基本的法則,其他的就不用管了,這個引擎很聰明的,它會自己動手去完成接下來的碰撞運算.
OK,開始介紹box2d的奇幻物理世界:
1、即然稱為世界當然第一部就是建立一個世界容器,在box2d建立一個世界只有一個方法,就是定義一個世界:b2AABB 這個世界就是整個box2d 的window,為了防止在這世界裡的物體亂跑,所以必需定義上下界的範圍lowerbound 和 upbound(沒定的話就會像人失去重力一樣在外太空間裡漂啊漂的).
b2AABB worldAABB;
worldAABB.lowerBound.Set(-100.0f, -100.0f);
worldAABB.upperBound.Set(100.0f, 100.0f);
2、如同1、所言會像在外太空間裡漂啊漂,所以我們接著就要設定重力,依據牛頓這個超級牛人所言,重力是向量的一種,所以它有方向性:b2vec2(0.0f,-10.0f);
雖然我們有設了重力,但我們搞研發的都清楚,凡事總有例外,所以為了有些物體就這樣動啊動的就跑到界外了,所以為了處理這種例外的產生,我們就需要設定
BOOL doSleep=TURE;
這段的意思是當發現物體出界時,就讓這個物體就進入睡眠狀態,box2D不要去理它就好。
3、我們將2、的2項設定是因為這個世界容器就如同一個空白的記憶體區塊而設定世界容器就是定義一個記憶體空間,所以才需要有上下界的原因,而設定重力的參數是為了定義自由落體的方向,免得一個物體在經由碰撞后會亂飄,也就是讓在這個世界空間裡的全部物件都向同一個方向落下。
4、有了上述的的世界空間的就如同在地球上的感覺,所以我們需要再加上一個地表的東東,來做為一個平台,因為我稱為地表是因為它是個永久不動的,雖然實際的地球是一直動,所以我才叫奇幻世界,在奇幻世界地表是不動的。在box2D不會動的物件就叫靜態物件,表示這個物件不俱碰撞機制,因為誰去碰它誰就倒霉不是嗎?
定義一個地表區域:
b2BodyDef groundBoyDef;
groundBoyDef.Position.Set(0.0f, -10.0f); //為何要設0.0,-10.0f,我還沒去深究它,我只是照抄而以,別打我
5、接下來我們要做的事就是將地表這個物體加到世界容器裡,在box2d加物體都是用一種方式:
b2Body* groundBoy = world.CreateBody(&groundBoyDef);
↑ ↑ ↑
物體變數名 世界容器物件 加什麼物體
6、ok我們加了地表物件了,即然有地表當然還需要一個外形:
b2PolygroundDef groundShapeDef;//設定一個多邊形
groundShapeDef.SetAsBox(50.0f,10.0f);//SetAsBox設定一個矩形外形
在box2D在外形的支援上只有3種,線,圓和多邊形,我們寫SetAsBox(x,y),實際上的大小要乘上2倍才是實際值,所以(50.0f,10.0f) x=100 y=20;
還有一點box2D使用kms制的物理單位 米.公斤
7、再來將這個外形加到地表物件,有點像貼紋理很像,所以可以了解到每個物體都有外形,也就是說外形是無法單獨存在世界容器里。
groundBoy->CreateShape(&groundShapeDef);
到這裡我們的世界容器就算建立完成了,但只是一個靜止的世界而以。
8、在4、時,我們加了一個地表物體(靜態物體),所以一定會有一個相對物體﹣>動態物體,答對了。大家都好害利,拍手
建立的方法與靜態物體很相似<﹣是相似,不是一樣哦
b2BodyDef bodyDef;
bodyDef.position.Set(0.0f,4.0f);
b2Body *body=wold.CreateBody(&bodyDef);
疑!一樣的過程啊,那是當然的動態物體也是物體啊。
再來不一樣的地方來了哦
b2PolygonDef ShapeDef;
ShapeDef.SetAsBox(1.0f,1.0f);
ShapeDef.density=1.0f;<﹣設定物體的密度,這是與靜態物體最大的差異,沒設就是0:靜態物體
ShapeDef.friction=0.3f;<﹣設定物體的摩擦力
body->CreateShape(&ShapeDef);
Body->SetMassFromeShape();<﹣設定繪滿物體