16--Box2D使用(2、顯示物理世界)

         在上一篇文章中咱們建立了的一個物理世界,當物理世界中的剛體一個也沒有顯示出來。爲顯示物理世界中的物體,咱們須要引入GLES-Render(調試Box2D使用)。這兩個文件能夠再函數

         %Cocos_Home%\samples\Cpp\TestCpp\Classes\Box2DTestBed中找到,將這兩個文件拷貝到項目中並引入工程中。ui

image

        再聲明一個變量this

    b2World* world;
    b2Body* wallBody ;

    float32 wallLineOffset ;

    GLESDebugDraw* m_debugDraw;  //調試物理世界繪製對象

       聲明兩個函數spa

    void printDebugDraw(bool isPrint);
    virtual void draw();

       printDebugDraw實現debug

void HelloWorld::printDebugDraw(bool isPrint){
    if(!isPrint)
        return;
    //根據像素與米的轉換系數建立調試繪製對象
    m_debugDraw = new GLESDebugDraw( PIXEL_TO_METER );
    world->SetDebugDraw(m_debugDraw);   

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

        draw實現調試

void HelloWorld::draw()  
{  
    CCLayer::draw();

    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

    kmGLPushMatrix();

    world->DrawDebugData();

    kmGLPopMatrix();

}

        修改createWorld code

void HelloWorld::createWorld()
{
    b2Vec2 gravity;
    gravity.Set(0.0f,-9.0f);   //物理世界重力向量,這裏建立一個向下的重力向量
    b2BodyDef* bodydef = new b2BodyDef();
    world = new b2World(gravity);    //根據重力向量建立物理世界對象

    world->SetAllowSleeping(true);   //容許休眠    
    world->SetWarmStarting(true);    //初始狀態將受到重力影響

    printDebugDraw(true);
}
       如今運行看看效果吧

若水GIF截圖_2014年8月1日13點48分46秒

     物理世界的物體就顯示出來了,但那幾個球怎麼沒有動呢?不用急,是由於咱們尚未讓物理世界運行起來。對象

      讓物理世界運行起來blog

      添加函數ci

void HelloWorld::update(float dt)
{
    //速度迭代次數
    int velocityIterations = 8;
    //位置迭代次數
    int positionIterations = 1;

    world->Step(dt, velocityIterations, positionIterations);  //dt爲時間步長

}

       在init方法中添加代碼

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    wallLineOffset = 0.5;

    this->createWorld();
    this->createWall();
    this->createBall();

    this->scheduleUpdate(); //不斷調用update函數 

     ……
   

    return true;
}

       再運行看看效果

若水GIF截圖_2014年8月1日14點2分56秒

相關文章
相關標籤/搜索