Box2d系列 – 如何在cocos2d-x中激活debug draw

本文转自http://blog.csdn.net/dick_china/article/details/7751818

本文的读者要求是, 熟悉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__  

然后在BoxLayer.cpp中实现一些cocos2d-x的基本方法,
其中draw方法代码如下 , 具体细节不讨论。

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();   //画出来  

注:

b2DebugDraw类中有7个标志常量:
b2DebugDraw.e_aabbBit :表示显示刚体的边界盒
b2DebugDraw.e_jointBit :表示显示刚体相连时的节点和连线
b2DebugDraw.e_obbBit :显示凸多边形的边界,不显示圆的边界
b2DebugDraw.e_pairBit:draw broad-phase pairs(不知如何翻译是好用原文)
b2DebugDraw.e_coreShapeBit:draw core (TOI) shapes
b2DebugDraw.e_shapeBit:显示刚体的形状,不管是何种形状
b2DebugDraw.e_centerOfMassBit:显示质量中心。重心?质心?

编译运行我们就可以在没有贴图的情况下看到东西了,


但是debugdraw功能要比我们想象的强大的多,他会根据物体的不同的状态显示不同的颜色,是debug的好帮手啊。
详情可以参看box2d的官方文档,里面有很多关于debugdraw的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值