cocos2dx3.2 物理引擎之碰撞

#include "HelloWorldScene.h"  

USING_NS_CC;  

//物理引擎标识  
int ball1Mask = 1 << 0;//球1  
int ball2Mask = 1 << 1;//球2  
int wallMask = 1 << 2;//地面  

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;  
}  

// on "init" you need to initialize your instance  

void HelloWorld::onEnter()  
{  
    Layer::onEnter();  
    //添加监听器  
    auto contactListener=EventListenerPhysicsContact::create();  
    //设置监听器的碰撞开始函数  
    contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);  
    //添加到事件分发器中  
    _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);  
}  
bool HelloWorld::init()  
{  
    //  
    // 1. super init first  
    if ( !Layer::init() )  
    {  
        return false;  
    }  



    Size visibleSize=Director::getInstance()->getVisibleSize();  
    Point origin=Director::getInstance()->getVisibleOrigin();  

    ballOne=Sprite::create();  
    ballOne->setContentSize(Size(50, 50));  
    ballOne->setPosition(visibleSize.width/2,visibleSize.height/2);  
    //创建物体,并且物体的形状为圆形,第一参数为半径,第二个参数为物体材质  
    //第三个参数为边的厚度,就是在Debug模式下看到的物体外面线条的厚度,默认为0  
    PhysicsBody* ballBodyOne=PhysicsBody::createCircle(ballOne->getContentSize().width/2,PHYSICSBODY_MATERIAL_DEFAULT, Vec2(1,1));  
    //  
    //ballBodyOne->setCategoryBitmask(1);  

    //是否设置物体为静态  
    //ballBody->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);  

    //设置物体的冲力  
    Vect force=Vect(500000.0f, 500000.0f);  
    ballBodyOne->applyImpulse(force);  
    //把物体添加到精灵中  
    ballOne->setPhysicsBody(ballBodyOne);  
    //设置标志  
    ballOne->setTag(1);  
    this->addChild(ballOne);  

    //设置第二个球  
    ballTwo=Sprite::create();  
    ballTwo->setContentSize(Size(100, 100));  
    ballTwo->setPosition(visibleSize.width/3,visibleSize.height/3);  
    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);  

    force=Vect(-500000.0f, -500000.0f);  
    ballBodyTwo->applyImpulse(force);  
    ballTwo->setPhysicsBody(ballBodyTwo);  
    ballTwo->setTag(2);  
    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);  

    edgeSpace->setPhysicsBody(boundBody);  
    edgeSpace->setPosition(Point(visibleSize.width/2,visibleSize.height/2));  
    this->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 PhysicsContact& contact)  
{  

    if ((contact.getShapeA()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask) {  
        CCLOG("ball1 touch something");  
    }  
    if ((contact.getShapeB()->getBody()->getCategoryBitmask() & ball1Mask) == ball1Mask) {  
        CCLOG("ball1 touch something");  
    }  


    if ((contact.getShapeA()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask) {  
        CCLOG("ball2 touch something");  
    }  
    if ((contact.getShapeB()->getBody()->getCategoryBitmask() & ball2Mask) == ball2Mask) {  
        CCLOG("ball2 touch something");  
    }  

    return true;  
}  
void HelloWorld::menuCloseCallback(Ref* pSender)  
{  
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)  
    MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");  
    return;  
#endif  

    Director::getInstance()->end();  

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)  
    exit(0);  
#endif  
} 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值