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
}
cocos2d-x之物理引擎之碰撞监测的更多相关文章
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
- UIDynamic仿物理引擎-浮动碰撞效果-b
最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou ...
- 【h5游戏开发】egret引擎p2物理引擎 - 小球碰撞地面搞笑的物理现象
重力的方向和地面的问题 p2中默认的方向是从上到下,如果重力默认是正数的话,物体放到世界中是会从上面往下面飘的 p2中plane地面默认的方向是y轴的方向,而在p2中y轴的方向默认是从上往下 首先来看 ...
- libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...
- Unity的物理引擎是如何实现碰撞的呢?
物理引擎不允许两个碰撞器重叠,当两个或多个物体碰撞时,Unity会根 据他们的旋转速度计算碰撞效果.计算主要根据物体的碰撞器是静止的还 是动态的.物体是不移动的,例如,墙,地面,院子里的喷池等.动态物 ...
- 基于HTML5的WebGL结合Box2DJS物理引擎应用
上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...
- 基于HT for Web 3D呈现Box2DJS物理引擎
上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...
- cocos2dx 3.2中的物理引擎初探(一)
cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我目前使用的是最新版的cocos2dx 3.2.引擎中默认使用的是chipmunk,如果想要改使用box2d的话,需 ...
随机推荐
- 有关CLR的初学小整理(可能理解不深刻,望大牛指出)
1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...
- HTML5 语义元素
返回目录 http://hovertree.com/h/bjaf/html5zixueji.htm 一个语义元素能够清楚的描述其意义给浏览器和开发者.无语义 元素实例: <div> 和 & ...
- 【循序渐进学Python】3. Python中的序列——字符串
字符串是零个或多个的字符所组成的序列,字符串是Python内建的6种序列之一,在Python中字符串是不可变的. 1. 格式化字符串 字符串格式化使用字符串格式化操作符即百分号%来实现.在%左侧放置一 ...
- php中的常用数组函数(一)(比较多个数组的差集的函数们 array_diff_assoc() array_diff() array_diff_key() array_diff_ukey() array_diff_uassoc())
array_diff_assoc($arr1, $arr2, $arr3,... n); 返回:一个$arr1的副本,后续的数组中出现一个键值相同的元素,就在副本中删掉这个元素,最后返回这个副本. 如 ...
- ahjesus约束方法或属性的调用方
class Program { static void Main(string[] args) { test(); run(); Console.ReadKey(); } static void ru ...
- 阿里前CEO卫哲用自己10余年经历,倾诉B2B的三差、四率、两大坑
今日(12 月 28 日),嘉御基金创始人.阿里巴巴(B2B)前 CEO 卫哲在第三届中国 B2B 电子商务大会上进行了"B2B 冬天里的春天"的主题分享.他提出中国 B2B 行业 ...
- 关于ArcGIS10.0中的栅格计算中的函数
版本升级确实很重要,在ArcGIS10.1中计算成功的,在10.0中出了问题. 问题 在进行栅格计算时,计算公式很简单,包括两个Ln函数: "-22.73 + 11.1 * Ln(5) + ...
- android 事件
package com.example.yanlei.my2; import android.app.Activity; import android.content.Context; import ...
- SharePoint 2010 文档管理之过期归档工具
前言:使用过SharePoint的人都知道,SharePoint对于操作是便捷的,但是对于数据量承载却是不令人满意的,这样,就要求我们需要更加合理的使用,规范大家的使用规则和习惯,所以,定期清理不必要 ...
- 通过源码理解UST(用户栈回溯)
UST原理:如果gflags标志中包含了UST标志,堆管理器会为当前进程分配一块内存,这个内存区域就是UST数据库(user-mode stack trace database),并建立一个STACK ...