1. 程式人生 > >cocos2d-x遊戲開發 跑酷(四) 關聯物理世界

cocos2d-x遊戲開發 跑酷(四) 關聯物理世界

前面一節雖然實現了一個跑動的人物,但是他僅僅只是一個精靈在執行一個跑動的幀動畫而已。這一節我要實現精靈和物理世界關聯,讓這個人跟實際的Parkour一樣,有實際體積,會碰撞。

一個精靈怎麼樣和一個物理的body關聯起來,使他具有一個剛體的特性。在cocos2d-x box2d 入門這篇文章裡面,我有簡單講了一下。有人說將一個body的userData設為精靈就可以了,其實這是不夠的。body的userData是一個void型指標,用來存放使用者自定義資料。如果僅僅這樣賦值一下,你會發現,精靈和剛體是分開運動的。這個userData是為了存放精靈,在後續位置迭代的時候方便取出這個精靈,然後將它和剛體的位置同步。看

cocos2d-x box2d 入門裡面的update函式,就知道還需要做位置迭代的。

為了方便,我把引擎自帶的物理精靈CCPhysicsSprite改了一下,去掉了chipmunk的程式碼,保留了box2d的介面。這個就是一個box2d的物理精靈B2Sprite。

然後將Runner裡面的成員變數mRunner型別改成B2Sprite,其建立函式也要修改為

 mRunner = B2Sprite::createWithSpriteFrameName(runner0);
 mRunnerSize = mRunner->getContentSize();
然後實現initBody()和initShape()函式
void Runner::initBody()
{
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    // 初始速度1.5
    bodyDef.linearVelocity = b2Vec2(1.5, 0);
    bodyDef.position = b2Vec2(getOffsetPx() / RATIO, (GROUND_HEIGHT + mRunnerSize.height / 2 )/ RATIO);
    mBody = mWorld->CreateBody(&bodyDef);
    
    // 關聯起來
    mRunner->setB2Body(mBody);
    mRunner->setPTMRatio(RATIO);
}

void Runner::initShape()
{
    b2PolygonShape shape;
    // 定義runner的形狀,一個box,引數是半寬高
    shape.SetAsBox(mRunnerSize.width / 2 / RATIO, mRunnerSize.height / 2 / RATIO);
    b2FixtureDef fixDef;
    fixDef.shape = &shape;
    mBody->CreateFixture(&fixDef);
}

然後跑起來就看到一個帶碰撞區域的精靈