#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

}

cocos2d-x之物理引擎之碰撞监测的更多相关文章

  1. [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)

    通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...

  2. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  3. UIDynamic仿物理引擎-浮动碰撞效果-b

    最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou ...

  4. 【h5游戏开发】egret引擎p2物理引擎 - 小球碰撞地面搞笑的物理现象

    重力的方向和地面的问题 p2中默认的方向是从上到下,如果重力默认是正数的话,物体放到世界中是会从上面往下面飘的 p2中plane地面默认的方向是y轴的方向,而在p2中y轴的方向默认是从上往下 首先来看 ...

  5. libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

    Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...

  6. Unity的物理引擎是如何实现碰撞的呢?

    物理引擎不允许两个碰撞器重叠,当两个或多个物体碰撞时,Unity会根 据他们的旋转速度计算碰撞效果.计算主要根据物体的碰撞器是静止的还 是动态的.物体是不移动的,例如,墙,地面,院子里的喷池等.动态物 ...

  7. 基于HTML5的WebGL结合Box2DJS物理引擎应用

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  8. 基于HT for Web 3D呈现Box2DJS物理引擎

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  9. cocos2dx 3.2中的物理引擎初探(一)

    cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需 ...

随机推荐

  1. WampServer 给电脑搭建apache服务器和php环境

    WampServer 给电脑搭建apache服务器和php环境 前端不仅要做页面展示层,还负责着数据交互的部分,不要等到后端人员做好工作了前端才开始对接,那样太被动了. 前端在完成静态页面的编码后,就 ...

  2. Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...

  3. myeclipse的实用快捷键

    (1)Ctrl+M切换窗口的大小(2)Ctrl+Q跳到最后一次的编辑处(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Desc ...

  4. Python入门笔记(22):Python函数(5):变量作用域与闭包

    一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除,否则他们存活到脚本运行结束,且对于所有的函数都可访问. 当搜索一个标识符(也称变量.名字等),Pyt ...

  5. 启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误

    启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误,如下 原因:eclipse的版本与jre或者jdk版本不 ...

  6. php中设定一个全局异常处理。全局catch。默认catch。默认异常处理

    <?php function handleMissedException($e) { echo "Sorry, something is wrong. Please try again ...

  7. php 7 windows redis 扩展

    搜了一圈也没找到redis 对于 php 7 windows 扩展,最后还是在apache lounge论坛找到了php7全扩展包 本人把里面的扩展全进行了上传(下载见本文底部) 在这里主要讲讲 ph ...

  8. Follow me to learn what is repository pattern

    Introduction Creating a generic repository pattern in an mvc application with entity framework is th ...

  9. oGrid 初探

    oGrid 是个还蛮有趣的 pure JavaScript grid 控件 code 并不多而且是纯 JavaScript 写成,一条小龙觉得还算蛮好理解,不像其他几乎都是用 Jquery 为 bas ...

  10. Oauth笔记

    上周的工作有安全验证这一块,但不懂,只知道有几个关键字Oauth.secret-key .token.签名等.今天就查下资料做笔记. Oauth是什么 不依靠用户账号和密码就能获得访问资源权限 本质: ...