初学Cocos2d-x3.1物理碰撞(1)

来源:互联网 发布:淘宝卖大米的营销策略 编辑:程序博客网 时间:2024/04/30 09:44
#include "cocos2d.h"USING_NS_CC;class HelloWorld : public cocos2d::Layer{public:    // there's no 'id' in cpp, so we recommend returning the class instance pointer    static cocos2d::Scene* createScene();    Sprite* ball;    PhysicsWorld* m_world;    void setPhyWorld(PhysicsWorld* world) {m_world = world;}    bool onContactBegin(const PhysicsContact& contact);    virtual bool init();        Sprite* ballOne;    Sprite* ballTwo;        CREATE_FUNC(HelloWorld);};


#include "HelloWorldScene.h"USING_NS_CC;int ball1Mask = 1 << 0;int ball2Mask = 1 << 1;int wallMask = 1 << 2;Scene* HelloWorld::createScene(){    //创建有物理空间的场景    auto scene = Scene::createWithPhysics();    //这事debug模式,使物体表面被线条保卫,主要是为了在调试中方便观察    scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);    //创建Layer层    auto layer = HelloWorld::create();    //把空间保持我们创建的层中    layer->setPhyWorld(scene->getPhysicsWorld());    scene->addChild(layer);    return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !Layer::init() )    {        return false;    }    //添加事件监听    auto contactListener = EventListenerPhysicsContact::create();    //设置回调函数    contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this);    //添加到事件分发器中    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener, this);    auto winSize = Director::getInstance()->getWinSize();        ballOne = Sprite::create();    ballOne->setContentSize(Size(50,50));    ballOne->setPosition(Vec2(winSize.width/2,winSize.height/2));        //创建物体,并且物体的形状为圆形,参数1为半径,参数2为物体材质,参数三为物体边缘厚度,即Debug模式下看到的物体外面线条的厚度,默认为0;    PhysicsBody* ballBodyOne = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT,Vec2(1,1));    //设置物体恢复力    ballBodyOne->getShape(0)->setRestitution(1.0f);    //设置物体摩擦力    ballBodyOne->getShape(0)->setFriction(0.0f);    //设置物体密度    ballBodyOne->getShape(0)->setDensity(1.0f);    //设置物体是否受重力系数影响    ballBodyOne->setGravityEnable(false);    //设置物体的冲力    Vect force = Vect(500000.0f,500000.0f);    ballBodyOne->applyImpulse(force);    //将物体加入精灵中    ballOne->setPhysicsBody(ballBodyOne);    ballOne->setTag(1);    addChild(ballOne);        //设置第二个球    ballTwo = Sprite::create();    ballTwo->setContentSize(Size(100,100));    ballTwo->setPosition(Vec2(winSize.width/3,winSize.height/3));    PhysicsBody* ballBodyTwo = PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT);    ballBodyTwo->getShape(0)->setRestitution(1.0f);    ballBodyTwo->getShape(0)->setFriction(0.0f);    ballBodyTwo->getShape(0)->setDensity(1.0f);    ballBodyTwo->setGravityEnable(false);        force = Vect(-500000.0f,-500000.0f);    ballBodyTwo->applyImpulse(force);    ballTwo->setPhysicsBody(ballBodyTwo);    ballTwo->setTag(2);    addChild(ballTwo);        //创建容器,用来碰撞    Sprite* edgeSpace = Sprite::create();    //设置盒子属性    PhysicsBody* boundBody = PhysicsBody::createEdgeBox(winSize,PHYSICSBODY_MATERIAL_DEFAULT,3);    boundBody->getShape(0)->setFriction(0.0f);//摩擦力    boundBody->getShape(0)->setRestitution(1.0f);//恢复力    edgeSpace->setPhysicsBody(boundBody);//将物体加入盒子    edgeSpace->setPosition(Vec2(winSize.width/2,winSize.height/2));    addChild(edgeSpace);    edgeSpace->setTag(0);        //碰撞检测    ballBodyOne->setCategoryBitmask(ball1Mask);    ballBodyOne->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);    ballBodyOne->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);    ballBodyTwo->setCategoryBitmask(ball2Mask);    ballBodyTwo->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);    ballBodyTwo->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);    boundBody->setCategoryBitmask(wallMask);    boundBody->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);    boundBody->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);        return true;}bool HelloWorld::onContactBegin(const cocos2d::PhysicsContact &contact){    if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask)    {        log("ball1 touch something");    }    if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask)    {        log("ball1 touch something");    }    if((contact.getShapeA()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask)    {        log("ball2 touch something");    }    if((contact.getShapeB()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask)    {        log("ball2 touch something");    }        return true;}


0 0