<span style="font-family: Arial,Helvetica,sans-serif; background-color: rgb(255,255,255);"> </span><span style="font-family: Arial,255);">开启debugDraw就是让物理引擎控制的世界变得可以看见,比如一个刚体,如果没有将它和某个精灵绑定,那么它是不可见的;如果你想看到它的位置大小,以便直接的观察它和其他元素之间的碰撞等物理效果,那么开启debugDraw可以让它的轮廓变得可见。</span>
网上搜了一些答案,但是一直没有搞出来,主要是 1、答案是对应Cocos2d-x旧版本的,2、没有讲清楚某些宏或头文件的引用 3、方法确实是错的,可能过时了
使用Box2d肯定要构建“世界”,即b2World对象,开启debugDraw就是需要给b2World对象对象多赋一个值,代码如下:
b2Vec2 gravity; gravity.Set(0,-10); auto world = new b2World(gravity); world->SetAllowSleeping(true); world->SetContinuousPhysics(true); m_world = new b2World(gravity); debugDraw = new GLESDebugDraw(PTM_RATIO); //这里新建一个 debug渲染模块 uint32 flags = 0; flags += b2Draw::e_shapeBit; flags += b2Draw::e_jointBit; flags += b2Draw::e_centerOfMassBit; debugDraw->SetFlags(flags); debugDraw->SetFlags(flags); //需要显示那些东西 m_world->SetDebugDraw(debugDraw); //设置就是最后一句,给m_world的m_debugDraw复制。
这里就会遇到第一个坑,这个成员的类型是b2Draw,是一个不能实例化对象的抽象类,系统本身的目的应该是让我们继承这个类,自己去构建绘制debugDraw的造型。但纠结这个问题的本身就是新手,比如我,怎么可能有能力去自己写物理引擎里的物体轮廓。还好Cocos2d-x源码包附带的demo里面有已经写好的类,可以直接用。名字为:GLES-Render.h 和GLES-Render.cpp。里面有继承b2Draw的类,已经写好了绘制物体轮廓的方法。所以这里的debugDraw对象通过
debugDraw = new GLESDebugDraw(PTM_RATIO);来构建。
这是初始化,那么还需要调用绘制方法,并且是不断地绘制,网上查到的方法都是重写当前sence类的draw方法,但是我用的版本(3.2)已经没有draw方法了,从Node类就finish(源码中方法后用这个关键词修饰了)了。看了下源码换成是重写:
void HelloWorld::draw(cocos2d::Renderer *renderer,const cocos2d::Mat4 &transform,uint32_t flags) { GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION ); m_world->DrawDebugData(); CHECK_GL_ERROR_DEBUG(); }
基本上就没有问题了,还有一个坑是 PTM_RATIO 这个宏,这是屏幕像素单位和物理引擎世界的单位米的换算比例。在debugDraw对象构建的时候要把它带进去:
debugDraw = new GLESDebugDraw(PTM_RATIO);
我按着网上查的32来设置的值,但之前没带这个值构建,导致绘制出的物体轮廓缩小的32倍,然后变得很小,以至于我以为没有绘制成功,然后找原因。细节坑死人啊!