使用物理引擎进行碰撞检测

来源:互联网 发布:php隐藏域名跳转代码 编辑:程序博客网 时间:2024/04/30 20:29

源码介绍

手机游戏源码cocos2d-x使用物理引擎进行碰撞检测 
在Cocos2d-x3.2中,物理世界被融入到Scene中,即当创建一个场景时,就可以指定这个场景是否使用物理引擎。
sprite自带body属性,直接设置body,而形状、约束等属性添加到body中即可。碰撞的检测通过事件分发器来监控,所以你首先要创建监听器--EventListenerPhysicsContact,再把其添加到分发器中。
出自:http://blog.csdn.net/cbbbc/article/details/38541099

效果图


源码介绍:

#ifndef _HELLOWORLD_SCENE_H_#define _HELLOWORLD_SCENE_H_#include "cocos2d.h"USING_NS_CC;class HelloWorld:public cocos2d::Layer{public:Sprite* ballOne;Sprite* ballTwo;PhysicsWorld* m_world;void setPhyWorld(PhysicsWorld* world) {m_world=world;};static cocos2d::Scene* createScene();virtual bool init();CREATE_FUNC(HelloWorld);virtual void onEnter();bool onContactBegin(const PhysicsContact& contact);};#endif#include "HelloWorldScene.h"Scene* HelloWorld::createScene(){   //创建有物理空间的场景  Scene* scene=Scene::createWithPhysics();  //设置Debug模式,你会看到物体的表面被线条包围,主要为了在调试中更容易地观察  scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);  HelloWorld* layer=HelloWorld::create();  //把空间保持我们创建的层中,就是上面所说m_world的作用,方便后面设置空间的参数  layer->setPhyWorld(scene->getPhysicsWorld());  scene->addChild(layer);  return scene;}bool HelloWorld::init(){if(!Layer::init()){return false;}Size visibleSize=Director::getInstance()->getVisibleSize();Point origin=Director::getInstance()->getVisibleOrigin();ballOne=Sprite::create("Ball.jpg");ballOne->setPosition(200,200);//创建物体,并且物体的形状为圆形,第一参数为半径,第二个参数为物体材质//第三个参数为边的厚度,就是在Debug模式下看到的物体外面线条的厚度,默认为0PhysicsBody* ballBodyOne=PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);//是否设置物体为静态//ballBodyOne->setDynamic(false);//设置物体的恢复力ballBodyOne->getShape(0)->setRestitution(1.0f);//设置物体的摩擦力ballBodyOne->getShape(0)->setFriction(0.0f);//设置物体密度ballBodyOne->getShape(0)->setDensity(1.0f);//设置质量//ballBodyOne->getShape(0)->setMass(5000);//设置物体是否受重力系数影响ballBodyOne->setGravityEnable(false);ballBodyOne->setCategoryBitmask(0x0001);ballBodyOne->setCollisionBitmask(0x0001);ballBodyOne->setContactTestBitmask(0x0001);//设置物体的冲力Vect force=Vect(500000.0f, 500000.0f);//把物体添加到精灵中ballOne->setPhysicsBody(ballBodyOne);//设置标志ballOne->setTag(1);this->addChild(ballOne);    ballBodyOne->applyImpulse(force);//ballOne->runAction(RepeatForever::create(//                 Sequence::create(MoveTo::create(1.0f,Vec2(300,200)),//MoveTo::create(1.0f,Vec2(300,400)),//MoveTo::create(1.0f,Vec2(200,400)),//MoveTo::create(1.0f,Vec2(200,200)),//NULL)));//设置第二个球ballTwo=Sprite::create("Ball.jpg");ballTwo->setPosition(700,400);    PhysicsBody* ballBodyTwo=PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);//是否设置物体为静态//ballBodyTwo->setDynamic(false);ballBodyTwo->getShape(0)->setRestitution(1.0f);ballBodyTwo->getShape(0)->setFriction(0.0f);ballBodyTwo->getShape(0)->setDensity(1.0f);ballBodyTwo->setGravityEnable(false);ballBodyTwo->setCategoryBitmask(0x0001);ballBodyTwo->setCollisionBitmask(0x0001);ballBodyTwo->setContactTestBitmask(0x0001);force=Vect(-500000.0f, -500000.0f);ballTwo->setPhysicsBody(ballBodyTwo);ballTwo->setTag(2);    ballBodyTwo->applyImpulse(force);/*ballTwo->runAction(RepeatForever::create(                 Sequence::create(MoveTo::create(1.0f,Vec2(100,400)),                                MoveTo::create(1.0f,Vec2(700,400)),NULL)));*/this->addChild(ballTwo);//创建一个盒子,用来碰撞Sprite* edgeSpace=Sprite::create();PhysicsBody* boundBody=PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,3);boundBody->getShape(0)->setFriction(0.0f);boundBody->getShape(0)->setRestitution(1.0f);    /*boundBody->setCategoryBitmask(0x0011);boundBody->setCollisionBitmask(0x0011);boundBody->setContactTestBitmask(0x0);*/edgeSpace->setPhysicsBody(boundBody);edgeSpace->setPosition(Point(visibleSize.width/2,visibleSize.height/2));this->addChild(edgeSpace);edgeSpace->setTag(0);
<span style="white-space:pre">//添加一个框    auto parent = Sprite::create("YellowSquare.png");    parent->setPosition(200, 100);    parent->setPhysicsBody(PhysicsBody::createBox(parent->getContentSize()*parent->getScale(), PhysicsMaterial(0.1f, 1.0f, 0.0f)));    parent->getPhysicsBody()->setTag(2);    parent->setTag(1);    addChild(parent);</span>return true;}void HelloWorld::onEnter(){Layer::onEnter();//添加监听器auto contactListener=EventListenerPhysicsContact::create();//设置监听器的碰撞开始函数    contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);//添加到事件分发器中_eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);}bool HelloWorld::onContactBegin(const PhysicsContact& contact){Sprite* spriteA=(Sprite*)contact.getShapeA()->getBody()->getNode();Sprite* spriteB=(Sprite*)contact.getShapeB()->getBody()->getNode();int tagA=spriteA->getTag();int tagB=spriteB->getTag();if(tagA==1&&tagB==2||tagA==2&&tagB==1){        /*spriteA->removeFromParent();spriteB->removeFromParent();        */}return true;}



0 0
原创粉丝点击