[ZZ]http://www.ipplelife.com/?p=713
本文的读者要求是, 熟悉cocos2d-x流程, 熟悉box2d的基本代码。
很久没写cocos2dx的东西了,最近比赛接近,做题太郁闷就练习下使用box2d,好歹也发时间看完了官方文档的。。
本来很想发时间写一些关于Box2d的基础的,但是我怕我写不好,内容太多太多了。
所以,自己学到什么就写什么吧。
box2d是个物理引擎, 所以物体应当由几何图形构成,如果我们开始写就是用材质贴图的话, 可能会影响我们的效率,所以我建议是,
先构建好完整的物理系统,然后将再使用CCsprite绑定到b2body的userdata上去,只需加东西修改即可。
避免了烦琐的过程。
首先我们需要拷贝
GLES-Render.cpp
GLES-Render.h到我们工作的目录,
这个两个文件可以在coco2d-x的示例代码中的tests\Box2DTestBed中可以找到。
这里面包含了一个GLESDebugDraw类继承与b2Draw类,
b2Draw类中大多数关于绘制几何图形的抽象方法,据我了解,在b2world中新出现一个刚体的形状时就会调用这些抽象方法。
而这个GLESDebugDraw的作用就是使用opengl将这些抽象方法实实在在的绘制出来。
具体如何操作了。
以一个简单的项目为例子,我们新建一个带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__
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); }
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的介绍。
如需要源代码,请留言。