zoukankan      html  css  js  c++  java
  • Cocos2d-x中由sprite来驱动Box2D的body运动(用来制作平台游戏中多变的机关)

      好久都没写文章了,就来一篇吧。这种方法是在制作《胖鸟大冒险》时用到的。《胖鸟大冒险》中使用Box2D来进行物理模拟和碰撞检測,因此对每一个机关须要创建一个b2body。然后《胖鸟》是依据《超级马里奥兄弟》设计的,所以机关能够是各种运动轨迹的平台,绕圈转的乌龟,蹦蹦跳的乌龟等。假设用box2d来做这些运动的话要自己写这些轨迹。可是Cocos2d-x已经提供了非常多的action,自己添加action也非常方便。反过来用sprite去设置box2d的b2body的位置就非常方便了。

      要求:全部的机关都设置为body type为b2_kinematicBody,这个type的优点是能够有速度,可是不会物理模拟,而且能够和type为b2_dynamicBody的body发生碰撞检測。

      如果我们用一个反复移动的平台机关为sprPlatform,这个平台反复上下移动,代码例如以下:

    sprPlatform->runAction(CCRepeatForever::create(CCSequence::create(CCMoveBy::create(2, ccp(0, 100)),
    								  CCMoveBy::create(2, ccp(0, -100)),
    								  NULL)));


    然后在sprPlatform的update里设置b2body的属性

    void update(float delta) 
    {
    	//更新位置
    	float angle = getRotation();																  
    	CCPoint curPos = getPosition();
    	b2Vec2 shapeCenter(curPos.x/PTM_RATIO, curPos.y/PTM_RATIO);
    	body->SetTransform(shapeCenter, CC_DEGREES_TO_RADIANS(360-angle) );
    	
    	//更新速度,这个是为了让机关保持匀速
    	body->SetLinearVelocity(b2Vec2((curPos.x-lastPos.x)/gPlatformMovingFactor, (curPos.y-lastPos.y)/gPlatformMovingFactor));
    	
    	lastPos = curPos;
    }																  
    


    至于gPlatformMovingFactor,在《胖鸟》里为1.066681。由于b2_kinematicBody仅仅有速度没有质量,所以仅仅能依据某段时间内body移动了多少像素来计算这个数据。总之达到sprite的移动和b2body的移动匹配。b2_kinematicBody假设没有velocity的话,b2_dynamicBody就无法被platform带动。

    另外须要注意的是b2body的anchor point是(0.5,0.5),而cocos2dx的sprite能够自己设置,所以须要自己做些简单的转换。


      这样b2body就被sprite带动了。




  • 相关阅读:
    唐伯虎
    朱元璋
    [再寄小读者之数学篇](2014-06-28 证明级数几乎处处收敛)
    [家里蹲大学数学杂志]第053期Legendre变换
    About the Importance of Aim in Life
    An Apple a day keeps the doctor away
    Love Me,Love My Dog
    关于工作
    关于失败
    Erdos
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3765470.html
Copyright © 2011-2022 走看看