cocos2d-x中使用box2d物理引擎时,开启debugDraw的方法

前端之家收集整理的这篇文章主要介绍了cocos2d-x中使用box2d物理引擎时,开启debugDraw的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<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();
}

这个方法,在这里面调用DrawDebugData();

基本上就没有问题了,还有一个坑是 PTM_RATIO 这个宏,这是屏幕像素单位和物理引擎世界的单位米的换算比例。在debugDraw对象构建的时候要把它带进去:

debugDraw = new GLESDebugDraw(PTM_RATIO);

我按着网上查的32来设置的值,但之前没带这个值构建,导致绘制出的物体轮廓缩小的32倍,然后变得很小,以至于我以为没有绘制成功,然后找原因。细节坑死人啊!

猜你在找的Cocos2d-x相关文章