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

    }

  • 相关阅读:
    安装 Java 开发工具包JDK(Windows版本)
    在sublime text 3中让.vue文件的内容变成彩色
    iOS之禁止所有输入法的表情
    iOS之UIButton扩大按钮的响应区域
    iOS之利用腾讯Bugly程序调试,测试代码bug、卡顿等情况
    iOS之在本地搭建IPv6环境测试你的app
    iOS之让UISearchBar搜索图标和placeholder靠左显示
    iOS之限制TextField的输入长度
    iOS之oc与html之间的交互(oc中调用js的方法)
    iOS之面试题:腾讯三次面试以及参考思路
  • 原文地址:https://www.cnblogs.com/daochong/p/5263069.html
Copyright © 2011-2022 走看看