
<span > </span><span >开启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();}
这个方法,在这里面调用DrawDeBUGData();
基本上就没有问题了,还有一个坑是 PTM_RATIO 这个宏,这是屏幕像素单位和物理引擎世界的单位米的换算比例。在deBUGDraw对象构建的时候要把它带进去:
deBUGDraw = new GLESDeBUGDraw(PTM_RATIO);
我按着网上查的32来设置的值,但之前没带这个值构建,导致绘制出的物体轮廓缩小的32倍,然后变得很小,以至于我以为没有绘制成功,然后找原因。细节坑死人啊!
总结以上是内存溢出为你收集整理的cocos2d-x中使用box2d物理引擎时,开启debugDraw的方法全部内容,希望文章能够帮你解决cocos2d-x中使用box2d物理引擎时,开启debugDraw的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)