zoukankan      html  css  js  c++  java
  • cocos2d-x之物理引擎之碰撞监测

    #include "HelloWorldScene.h"

    USING_NS_CC;

    #define RED_BIT_MASK    0b0100

    #define GREEN_BIT_MASK  0b0010

    #define BLUE_BIT_MASK   0b0001

    #define EDGE_BIT_MASK   0b1000

    Scene* HelloWorld::createScene()

    {

        auto scene = Scene::createWithPhysics();

        scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);

        scene->getPhysicsWorld()->setGravity(Vec2(0,-1000));

        

        auto layer = HelloWorld::create();

        scene->addChild(layer);

        return scene;

    }

    bool HelloWorld::init()

    {

        if ( !Layer::init() )

        {

            return false;

        }

        visibleSize=Director::getInstance()->getVisibleSize();

        

        auto touchListener=EventListenerTouchOneByOne::create();

        touchListener->onTouchBegan =[this](Touch * t,Event * e){

            this->addBox(t->getLocation());

            return false;

        };

        Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener,this);

        

        auto contactListener=EventListenerPhysicsContact::create();

        contactListener->onContactBegin=[](PhysicsContact & contact){

            switch (contact.getShapeA()->getBody()->getContactTestBitmask()|contact.getShapeB()->getBody()->getContactTestBitmask()) {

                case RED_BIT_MASK|BLUE_BIT_MASK:

                    log("red rect contact blue rect");

                    break;

                case RED_BIT_MASK|GREEN_BIT_MASK:

                    log("red rect contact green rect");

                    break;

                case BLUE_BIT_MASK|GREEN_BIT_MASK:

                    log("blue rect contact green rect");

                    break;

                case RED_BIT_MASK|EDGE_BIT_MASK:

                    log("red rect hit edge");

                    break;

                case GREEN_BIT_MASK|EDGE_BIT_MASK:

                    log("green rect hit edge");

                    break;

                case BLUE_BIT_MASK|EDGE_BIT_MASK:

                    log("blue rect hit edge");

                    break;

                case GREEN_BIT_MASK:

                    log("two green rect hit");

                    break;

                default:

                    break;

            }

            return true;

        };

        Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(contactListener,this);

        

        return true;

    }

    void HelloWorld::onEnter(){

        Layer::onEnter();

        

        auto bounds=Node::create();

        bounds->setContentSize(visibleSize);

        bounds->setPhysicsBody(PhysicsBody::createEdgeBox(bounds->getContentSize()));

        bounds->getPhysicsBody()->setContactTestBitmask(EDGE_BIT_MASK);

        bounds->setPosition(visibleSize/2);

        addChild(bounds);

        

        addBox(visibleSize/2);

    }

    void HelloWorld::addBox(Vec2 position){

        auto r=Sprite::create();

        r->setTextureRect(Rect(50,50,50,50));

        r->setPhysicsBody(PhysicsBody::createBox(r->getContentSize()));

        addChild(r);

        r->setPosition(position);

        

    //    switch (rand()%6) {

    //        case 0:

    //            r->setColor(Color3B(255,0,255));

    //            break;

    //        case 1:

    //            r->setColor(Color3B(255,0,0));

    //            break;

    //        case 2:

    //            r->setColor(Color3B(0,255,0));

    //            break;

    //        case 3:

    //            r->setColor(Color3B(0,0,255));

    //            break;

    //        case 4:

    //            r->setColor(Color3B(0,255,255));

    //            break;

    //        case 5:

    //            r->setColor(Color3B(255,255,0));

    //            break;

    //        default:

    //            break;

    //    }

        switch (rand()%3) {

            case 0:

                r->setColor(Color3B(255,0,0));

                r->getPhysicsBody()->setContactTestBitmask(RED_BIT_MASK);

                break;

            case 1:

                r->setColor(Color3B(0,255,0));

                r->getPhysicsBody()->setContactTestBitmask(GREEN_BIT_MASK);

                break;

            case 2:

                r->setColor(Color3B(0,0,255));

                r->getPhysicsBody()->setContactTestBitmask(BLUE_BIT_MASK);

                break;

            default:

                break;

        }

    }

    void HelloWorld::menuCloseCallback(Ref* pSender)

    {

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

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

        exit(0);

    #endif

    }

  • 相关阅读:
    辞职后的第二个星期
    最近似乎应该休眠了.
    文件.二进制转换
    AVL树
    ajax 的同步和异步
    在SQL Server实现最短路径的搜索
    网页嵌套com例子
    Vs2005 dll 设置def导出函数
    [转]ATL开发一个ActiveX
    Atl COM发布与优化
  • 原文地址:https://www.cnblogs.com/daochong/p/5263069.html
Copyright © 2011-2022 走看看