2014年11月19日 星期三

关于cocos2d-X 3.x版本使用引擎自带的物理引擎Physics

http://blog.csdn.net/u013642494/article/details/38855743

今天本来打算使用BOX2D物理引擎的, 想到前段时间听说cocos2d-X在3.0版本中封装了一个自己的物理引擎Physics, 听名字就很霸气额, 用起来确实是比BOX2D简单很多( 毕竟是基于BOX2D封装的嘛), 好了, 现在我们来看看如何使用Physics这个物理引擎,


第一步: 创建项目............略
第二部: 修改场景的创建方式
将Scene::create();换成Scene::createWithPhysics();
  1. Scene* HelloWorld::createScene()  
  2. {  
  3.     //使用物理世界创建场景  
  4.     auto scene = Scene::createWithPhysics();  
  5.   
  6.     //显示物理世界调试状态, 显示红色的框, 方便调试  
  7.     scene->getPhysicsWorld()->setDebugDrawMask( PhysicsWorld::DEBUGDRAW_ALL);  
  8.       
  9.     auto layer = HelloWorld::create();  
  10.   
  11.     scene->addChild(layer);  
  12.   
  13.     return scene;  
  14. }  


第三部: 在onEnter()里面创建一个世界盒子
  1. void HelloWorld::onEnter()  
  2. {  
  3.     Size visibleSize = Director::getInstance()->getVisibleSize();  
  4.   
  5.     //创建一个物理世界, 大小和屏幕的尺寸相同, 使用默认材质, debug框的宽度为3个像素  
  6.     auto body = PhysicsBody::createEdgeBox( visibleSize, PHYSICSBODY_MATERIAL_DEFAULT, 3);  
  7.   
  8.     //创建一个碰撞图形  
  9.     auto edgeShape = Node::create();  
  10.   
  11.     //将图形和刚刚创建的世界绑定  
  12.     edgeShape->setPhysicsBody( body);  
  13.   
  14.     //设置图形的位置在屏幕正中间  
  15.     edgeShape->setPosition( visibleSize.width / 2, visibleSize.height / 2);  
  16.   
  17.     //添加进图层  
  18.     addChild( edgeShape);  
  19. }  


看看, 一个和我们屏幕大小一样的物理世界就创建成功了

第四部: 添加一个物理精灵
我们写一个函数吧
  1. void HelloWorld::addSprite( cocos2d::Vec2 pos)  
  2. {  
  3.     auto body = Sprite::create( "CloseNormal.png");  
  4.   
  5.     //设置一个正方形绑定在精灵上面  
  6.     body->setPhysicsBody( PhysicsBody::createBox( body->getContentSize()));  
  7.   
  8.     body->setPosition( pos);  
  9.   
  10.     addChild( body);  
  11. }  



我们在init()里面调用这个函数, 并将这个精灵设置在屏幕的正中间
  1. addSprite( Vec2( visibleSize.width / 2, visibleSize.height / 2));  



看看效果, 是不是一个东西在往下落, 速度还越来越快

额, 这个图形貌似是个圆形的, 我们还是创建一个圆形的碰撞图形吧, 将
  1. body->setPhysicsBody( PhysicsBody::createBox( body->getContentSize()));  

改为

  1. body->setPhysicsBody( PhysicsBody::createCircle( body->getContentSize().width / 2));  

看, 我们创建的图形是不是就是一个圆形了




额, 这样看起来好无趣, 我们再做一个事件监听吧, 点一个出来一个, 这样应该会比较好玩
在init()里面
  1. //创建单点触摸事件监听  
  2. auto listener = EventListenerTouchOneByOne::create();  
  3.   
  4. //触发触摸开始事件时进行的操作  
  5. listener->onTouchBegan = [this](Touch* t, Event* e)  
  6. {  
  7.     this->addBall( t->getLocation().x, t->getLocation().y);  
  8.   
  9.     return false;  
  10. };  
  11.   
  12. //绑定监听对象  
  13. Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority( listener, this);  



好了, 大功告成了