原創。轉載注明出處http://blog.csdn.net/dawn_moon/article/details/21451077
前面一節盡管實現了一個跑動的人物,可是他只不過一個精靈在運行一個跑動的幀動畫而已。這一節我要實現精靈和物理世界關聯。讓這個人跟實際的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();??
- 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);??
- }??
然后跑起來就看到一個帶碰撞區域的精靈