cocos2d-x物理引擎的实现

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

运行结果:

 

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

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

你可能感兴趣的:(cocos2d-x,box2D,物理引擎)