本文的讀者要求是, 熟悉cocos2d-x流程, 熟悉box2d的基本代碼。函數
好久沒寫cocos2dx的東西了,最近比賽接近,作題太鬱悶就練習下使用box2d,好歹也發時間看完了官方文檔的。。
原本很想發時間寫一些關於Box2d的基礎的,可是我怕我寫很差,內容太多太多了。
因此,本身學到什麼就寫什麼吧。ui
box2d是個物理引擎, 因此物體應當由幾何圖形構成,若是咱們開始寫就是用材質貼圖的話, 可能會影響咱們的效率,因此我建議是,
先構建好完整的物理系統,而後將再使用CCsprite綁定到b2body的userdata上去,只需加東西修改便可。
避免了煩瑣的過程。spa
首先咱們須要拷貝
GLES-Render.cpp
GLES-Render.h到咱們工做的目錄,
這個兩個文件能夠在coco2d-x的示例代碼中的tests\Box2DTestBed中能夠找到。debug
這裏麪包含了一個GLESDebugDraw類繼承與b2Draw類,
b2Draw類中大多數關於繪製幾何圖形的抽象方法,據我瞭解,在b2world中新出現一個剛體的形狀時就會調用這些抽象方法。
而這個GLESDebugDraw的做用就是使用opengl將這些抽象方法實實在在的繪製出來。code
具體如何操做了。
以一個簡單的項目爲例子,咱們新建一個帶box2d的cocos2dx項目。
咱們新建BoxLayer.h 繼承於 CClayer繼承
#ifndef __BOX_LAYER_H__ #define __BOX_LAYER_H__ #include "cocos2d.h" #include "Box2D/Box2D.h" #include "GLES-Render.h" //這裏包含 #define PTM_RATIO 32 class BoxLayer : public cocos2d::CCLayer { public: b2World * world; //物理世界 GLESDebugDraw *debugDraw; //這裏新建示例 virtual bool init(); static cocos2d::CCScene * scene(); void update(cocos2d::ccTime dt); //這個是控制box2d世界的刷新器 void draw(); //這裏須要一個關鍵的draw函數, LAYER_NODE_FUNC(BoxLayer); }; #endif // __HELLOWORLD_SCENE_H__
而後在BoxLayer.cpp中實現一些cocos2d-x的基本方法,
其中draw方法代碼以下 , 具體細節不討論。ip
void BoxLayer::draw() { glDisable(GL_TEXTURE_2D); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); world->DrawDebugData(); //這個必定要寫 glEnable(GL_TEXTURE_2D); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); }
而後在init添加代碼以下文檔
debugDraw = new GLESDebugDraw(PTM_RATIO); //這裏新建一個 debug渲染模塊 world->SetDebugDraw(debugDraw); //設置 uint32 flags = 0; flags += b2Draw::e_shapeBit ; //b2Draw::e_centerOfMassBit; //獲取須要顯示debugdraw的塊 //b2Draw::e_aabbBit; //AABB塊 //b2Draw::e_centerOfMassBit; 物體質心 //b2Draw::e_jointBit; //關節 //b2Draw::e_shapeBit; 形狀 debugDraw->SetFlags(flags); //須要顯示那些東西 draw(); //畫出來
編譯運行咱們就能夠在沒有貼圖的狀況下看到東西了,
可是debugdraw功能要比咱們想象的強大的多,他會根據物體的不一樣的狀態顯示不一樣的顏色,是debug的好幫手啊。
詳情能夠參看box2d的官方文檔,裏面有不少關於debugdraw的介紹。it
來自:http://www.ipplelife.com/?p=713編譯