• 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,其创建函数也要改动为

    1. mRunner = B2Sprite::createWithSpriteFrameName(runner0);  
    2. mRunnerSize = mRunner->getContentSize();  
    然后实现initBody()和initShape()函数

    1. void Runner::initBody()  
    2. {  
    3.     b2BodyDef bodyDef;  
    4.     bodyDef.type = b2_dynamicBody;  
    5.     // 初始速度1.5  
    6.     bodyDef.linearVelocity = b2Vec2(1.5, 0);  
    7.     bodyDef.position = b2Vec2(getOffsetPx() / RATIO, (GROUND_HEIGHT + mRunnerSize.height / 2 )/ RATIO);  
    8.     mBody = mWorld->CreateBody(&bodyDef);  
    9.       
    10.     // 关联起来  
    11.     mRunner->setB2Body(mBody);  
    12.     mRunner->setPTMRatio(RATIO);  
    13. }  
    14.   
    15. void Runner::initShape()  
    16. {  
    17.     b2PolygonShape shape;  
    18.     // 定义runner的形状,一个box,參数是半宽高  
    19.     shape.SetAsBox(mRunnerSize.width / 2 / RATIO, mRunnerSize.height / 2 / RATIO);  
    20.     b2FixtureDef fixDef;  
    21.     fixDef.shape = &shape;  
    22.     mBody->CreateFixture(&fixDef);  
    23. }  

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

  • 相关阅读:
    hdu3746 KMP的next数组应用,求项链首尾项链循环
    hdu4067 费用流(混合欧拉的宽展和延伸)
    hdu4067 费用流(混合欧拉的宽展和延伸)
    hdu1501 记忆化搜索
    hdu1501 记忆化搜索
    hdu1316 大数
    hdu1316 大数
    hdu4411 经典费用里建图
    hdu4411 经典费用里建图
    hdu4768 非常规的二分
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5043551.html
Copyright © 2020-2023  润新知