联系客服:400-805-1963

cocos2d-x物理引擎的实现
更新:HHH   时间:2023-1-7


 本次的cocos2d-x的版本号为2.1.3,废话不多说,直接上代码!!!!!

  1. #ifndef __HELLOWORLD_SCENE_H__ 
  2. #define __HELLOWORLD_SCENE_H__ 
  3.  
  4. #include "cocos2d.h" 
  5.  
  6. #include "Box2D/Box2D.h" 
  7. using namespace cocos2d; 
  8.  
  9. class HelloWorld : public cocos2d::CCLayer 
  10. { 
  11. public: 
  12.      
  13.     virtual bool init();   
  14.  
  15.     static cocos2d::CCScene* scene(); 
  16.     
  17.     CREATE_FUNC(HelloWorld); 
  18.  
  19.      HelloWorld (); 
  20.       ~HelloWorld (); 
  21.  
  22.       void tick(float time); 
  23.  
  24. private: 
  25.     //世界 
  26.     b2World *m_world; 
  27.  
  28.     //刚体 
  29.     b2Body *m_body; 
  30.  
  31.     //篮球 
  32.     CCSprite *m_ball; 
  33. }; 
  34.  
  35. #endif  // __HELLOWORLD_SCENE_H__ 

 

  1. #include "HelloWorldScene.h" 
  2.  
  3. using namespace cocos2d; 
  4.  
  5. #define PTM_RATIO 32.0 //像素到米的转换 
  6.  
  7.  HelloWorld :: HelloWorld () 
  8.  { 
  9.      m_world = NULL; 
  10.      m_body = NULL; 
  11.      m_ball = NULL; 
  12.  
  13.  } 
  14.  
  15.  HelloWorld::~HelloWorld() 
  16.  { 
  17.      delete m_world ; 
  18.      m_body = NULL; 
  19.      m_ball = NULL; 
  20.  } 
  21.  
  22.  
  23. CCScene* HelloWorld::scene() 
  24. { 
  25.     CCScene * scene = NULL; 
  26.     do  
  27.     { 
  28.         
  29.         scene = CCScene::create(); 
  30.         CC_BREAK_IF(! scene); 
  31.  
  32.         HelloWorld *layer = HelloWorld::create(); 
  33.         CC_BREAK_IF(! layer); 
  34.  
  35.         scene->addChild(layer); 
  36.     } while (0); 
  37.  
  38.     return scene; 
  39. } 
  40.  
  41.  
  42. bool HelloWorld::init() 
  43. { 
  44.     bool bRet = false; 
  45.     do  
  46.     { 
  47.  
  48.         CC_BREAK_IF(! CCLayer::init()); 
  49.          
  50.         CCSize size = CCDirector::sharedDirector()->getWinSize(); 
  51.  
  52.         //篮球 
  53.         m_ball = CCSprite::create("Ball.png"); 
  54.         CC_BREAK_IF(!m_ball); 
  55.         m_ball->setPosition(ccp(100,400)); 
  56.         this->addChild(m_ball); 
  57.  
  58.         //创建一个世界 
  59.         b2Vec2 gravity(0.0f,-10.0f); 
  60.         m_world = new b2World(gravity); 
  61.  
  62.         /**  创建围绕整个屏幕的边缘 **/ 
  63.         //刚体定义 
  64.         b2BodyDef groundBodyDef; 
  65.         groundBodyDef.position.Set(0,0); 
  66.  
  67.         //世界根据刚体定义生成刚体 
  68.         b2Body *groundBody = m_world->CreateBody(&groundBodyDef); 
  69.  
  70.         //生成形状 
  71.         b2EdgeShape groundBox; 
  72.  
  73.      
  74.         //关联定义 
  75.         b2FixtureDef boxShapeDef; 
  76.         boxShapeDef.shape = &groundBox; 
  77.  
  78.         //设置形状属性 ---下边框 
  79.         groundBox.Set( b2Vec2(0.0f,0.0f),b2Vec2(size.width/PTM_RATIO,0) ); 
  80.         //创建关联 
  81.         groundBody->CreateFixture(&boxShapeDef); 
  82.  
  83.         //设置形状属性 ---左边框 
  84.         groundBox.Set( b2Vec2(0.0f,0.0f),b2Vec2(0,size.height/PTM_RATIO) ); 
  85.         //创建关联 
  86.         groundBody->CreateFixture(&boxShapeDef); 
  87.  
  88.         //设置形状属性 ---上边框 
  89.         groundBox.Set( b2Vec2(0.0f,size.height/PTM_RATIO),b2Vec2(0,size.height/PTM_RATIO) ); 
  90.         //创建关联 
  91.         groundBody->CreateFixture(&boxShapeDef); 
  92.  
  93.         //设置形状属性 --右边框 
  94.         groundBox.Set( b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO), 
  95.                              b2Vec2(size.width/PTM_RATIO,0.0f) ); 
  96.         //创建关联 
  97.         groundBody->CreateFixture(&boxShapeDef); 
  98.  
  99.         //创建篮球刚体与形状 
  100.         b2BodyDef ballBodyDef; 
  101.         ballBodyDef.type =b2_dynamicBody; 
  102.         ballBodyDef.position.Set(100/PTM_RATIO,400/PTM_RATIO); 
  103.         //关联篮球精灵 
  104.         ballBodyDef.userData = m_ball; 
  105.         //创建篮球刚体 
  106.         m_body = m_world->CreateBody(&ballBodyDef); 
  107.  
  108.         //生成形状 
  109.         b2CircleShape circle; 
  110.         circle.m_radius = 26.0/PTM_RATIO; 
  111.  
  112.         //关联定义 
  113.         b2FixtureDef ballShapeDef; 
  114.         ballShapeDef.shape = &circle; 
  115.  
  116.         //密度 
  117.         ballShapeDef.density = 1.0f; 
  118.         //摩擦力 
  119.         ballShapeDef.friction = 1.0f; 
  120.         //反弹系数 
  121.         ballShapeDef.restitution = 0.8f; 
  122.         m_body->CreateFixture(&ballShapeDef); 
  123.  
  124.         this->schedule(schedule_selector(HelloWorld::tick),0.1f); 
  125.  
  126.         bRet = true; 
  127.     } while (0); 
  128.  
  129.     return bRet; 
  130. } 
  131.  
  132. void HelloWorld::tick(float time) 
  133. { 
  134.     //世界步 
  135.     m_world->Step(time,10,10); 
  136.  
  137.     //获取世界的里的刚体 
  138.     for ( b2Body *body = m_world->GetBodyList();body!=NULL;body=body->GetNext() ) 
  139.     { 
  140.         //获取篮球精灵 
  141.         if (body->GetUserData()) 
  142.         { 
  143.             //根据刚体的位置设置篮球精灵的位置 
  144.             CCSprite *ballSprite = (CCSprite*)body->GetUserData(); 
  145.             ballSprite->setPosition( ccp(body->GetPosition().x*PTM_RATIO, 
  146.                                      body->GetPosition().y*PTM_RATIO) ); 
  147.  
  148.             ballSprite->setRotation( -1*CC_RADIANS_TO_DEGREES(body->GetAngle()) ); 
  149.         } 
  150.     } 
  151. } 

运行结果:

 

代码已经写得很清晰了,我们总结下,首先创建一个世界,世界通过刚体定义生成刚体,关联把形状连接起来,刚体通过关联定义生成关联!!下面附上篮球一个!!

由于本人是业余,代码难免有所披露,望大家斧正!!谢谢,本人QQ947491240恭候大家拍砖!!再次感谢!!

附件:http://down.51cto.com/data/2362584
返回游戏开发教程...