cocos2d-x box2d使用调试绘图

#cocos2d-x box2d使用调试绘图

复制TestCpp的GLES-Render.h和GLES-Render.cpp过来。

添加一个成员变量:

GLESDebugDraw *m_debugDraw;

初始化物理引擎的时候:

void HNGameLayer::initPhysics()
{
    m_debugDraw = new GLESDebugDraw(RATIO);
    uint32 flags = 0;
    flags += b2Draw::e_shapeBit;
    flags += b2Draw::e_jointBit;
    flags += b2Draw::e_aabbBit;
    flags += b2Draw::e_pairBit;
    flags += b2Draw::e_centerOfMassBit;
    m_debugDraw->SetFlags(flags);
    m_b2World = new b2World(b2Vec2(0, -10));
    m_b2World->SetAllowSleeping(true);          // 允许物体进入休眠状态
    m_b2World->SetContinuousPhysics(true);      // 使用连续物理碰撞检测
    m_b2World->SetDebugDraw(m_debugDraw);
    
    ....其他代码
}

重写draw函数

void HNGameLayer::draw()
{
    CCLayer::draw();
    if (!m_bDebug) {
        return;
    }
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
    
    kmGLPushMatrix();
    
    m_b2World->DrawDebugData();
    
    kmGLPopMatrix();
    
    CHECK_GL_ERROR_DEBUG();
}

防止被背景阻挡了。因为draw函数话出来的东西的z-order应该是0,把背景的z-order设成负数就可以了

##3.1 从cpp-tests复制GLES-Render.h和GLES-Render.cpp过来。

1.添加两个个成员变量:

GLESDebugDraw *m_debugDraw;
cocos2d::CustomCommand m_customCmd;

2.初始化物理引擎的时候:

void HNGameLayer::initPhysics()
{
    m_debugDraw = new GLESDebugDraw(RATIO);
    uint32 flags = 0;
    flags += b2Draw::e_shapeBit;
    flags += b2Draw::e_jointBit;
    flags += b2Draw::e_aabbBit;
    flags += b2Draw::e_pairBit;
    flags += b2Draw::e_centerOfMassBit;
    m_debugDraw->SetFlags(flags);
    m_b2World = new b2World(b2Vec2(0, -10));
    m_b2World->SetAllowSleeping(true);          // 允许物体进入休眠状态
    m_b2World->SetContinuousPhysics(true);      // 使用连续物理碰撞检测
    m_b2World->SetDebugDraw(m_debugDraw);
    
    ....其他代码
}

3.重写draw()函数

void HNFoodThrowLayer::draw(Renderer *renderer, const Mat4 &transform, bool transformUpdated)
{
    Layer::draw(renderer, transform, transformUpdated);
    
    m_customCmd.init(_globalZOrder);
    m_customCmd.func = CC_CALLBACK_0(HNFoodThrowLayer::onDraw, this, transform, transformUpdated);
    renderer->addCommand(&m_customCmd);
}

4.添加onDraw函数

void HNFoodThrowLayer::onDraw(const Mat4 &transform, bool transformUpdated)
{
    if (m_isStartPhysicalWorld) {
        
        Director* director = Director::getInstance();
        CCASSERT(nullptr != director, "Director is null when seting matrix stack");
        director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
        director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);
        
        GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
        m_world->DrawDebugData();
        CHECK_GL_ERROR_DEBUG();
        
        director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    }
}

转载于:https://my.oschina.net/skyhacker2/blog/222796

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值