cocos2d-x游戏开发 跑酷(四) 关联物理世界

原创,转载注明出处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();
然后实现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);
}

然后跑起来就看到一个带碰撞区域的精灵






  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值