cocos2d-x遊戲開發 跑酷(四) 關聯物理世界
阿新 • • 發佈:2019-01-24
前面一節雖然實現了一個跑動的人物,但是他僅僅只是一個精靈在執行一個跑動的幀動畫而已。這一節我要實現精靈和物理世界關聯,讓這個人跟實際的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); }
然後跑起來就看到一個帶碰撞區域的精靈