关于cocos2dx 3.3出的physics物理引擎,如果想处理两个body碰撞一般作法都是先设置好各自Body的三个掩码,然后再在游戏场景里注册物理碰撞侦听器,然后调用onContactBegin处理,如下:

金币的

void Coin::initBody()
{
auto phyBody = PhysicsBody::createEdgeBox(getSprite()->getContentSize());
phyBody->setCategoryBitmask(1);
phyBody->setCollisionBitmask(1);
phyBody->setContactTestBitmask(1);

this->setPhysicsBody(phyBody);
}

人的:

auto runerBody = PhysicsBody::createBox(bodySize,material);
//设置碰撞检测参数
runerBody->setCategoryBitmask(1);
runerBody->setCollisionBitmask(1);
runerBody->setContactTestBitmask(1);

//绑定刚体
this->setPhysicsBody(runerBody);

然后在游戏场景里注册碰撞侦听器

void PlayScene::onEnter()
{
Layer::onEnter();
//注册物理碰撞
auto contactListener = EventListenerPhysicsContact::create();

contactListener->onContactBegin = CC_CALLBACK_1(PlayScene::onContactBegin,this);
_eventdispatcher->addEventListenerWithSceneGraPHPriority(contactListener,this);
}

然后在onContactBegin里处理碰撞就行了:

bool PlayScene::onContactBegin(cocos2d::PhysicsContact& contact)
{
auto body_1 = (Sprite*)contact.getShapeA()->getBody()->getNode(); //发生碰撞的物体1
auto body_2 = (Sprite*)contact.getShapeB()->getBody()->getNode(); //发生碰撞的物体2

//金币消失
if (body_1->getTag() == coinTag){
body_1->setVisible(false);
}
if (body_2->getTag() == coinTag){
body_2->setVisible(false);
}

return false;
}

看上去很简单,但是那三个掩码:

setCategoryBitmask,setCollisionBitmask,setContactTestBitmask是什么意思呢?看了官方的文档,注释,还有不知其数的介绍物理引擎大神的文章,还是一头雾水不知所以。一般为了省事,都把这三个掩码设为1,这样不论什么物体都会发生碰撞,也能响应处理函数,但是这样做真的好吗?所谓不求甚解只求洒脱可能就是这个意思,但这可不是什么好的治学态度,也正是国人从古到今这个态度造成了中国自古就诞生不了科学现在沦落为到处抱别人大腿伏下身来求施舍的窘境...

CategoryBitmask好理解,表示一个物体所属哪个类别

可是CollisionBitmask和ContactTestBitmask就不好理解了,官方文档解释为前者与category掩码相与是否为1表示是否能发生碰撞,contactTest掩码与category掩码相于是否为1决定了是与能产生碰撞响应.... 这是什么话,我翻来覆去怎么看都觉得说了半天都是一个意思嘛!都是是否能产生碰撞响应。到底有什么区别呢?

后来经过我不断的尝试修改,终于搞明白两者含义的区别:

setCategoryBitmask,setCollisionBitmask决定了是否能产生碰撞。产生碰撞和发生碰撞响应是不同的概念。如人物奔跑时碰到了金币,这里如果没有碰撞处理函数,且把什么掩码都设为1,那么你会发现角色碰到金币时角色不再向前移动了,金币成了一个挡在路上的砖块,这时已经发生了碰撞 了,但如果你把人的类别设为1,金币的类别设为0,而两者的CollisionBitmask都为1,则金币和人的CategoryBitmask和CollisionBitmask掩码相与为0,则不会发生碰撞,在游戏里效果就是人奔跑时穿过了金币,金币就像空气一样,这就是没有发生碰撞的含义。

那么ContactTestBitmask呢,这个参数决定了是否能触发碰撞响应函数 onContactBegin. 有些碰撞我们是不想处理的,如人物从空中落到一块大石头上,落到石头上只须停在石头上就行了,不需要做什么特殊的处理,这时你只需要将地面的类别设为0,人的类别设为1,ContactTestBitmask都设为1,这样相与的结果为0,就不会触发onContactBegin函数。那你该问了,你不处理那人怎么会停在石头上而不掉下去?不用担心,这是物理引擎的事,也正是物理引擎的强大之处,我们只要设置了刚体body就可以很轻松的写出一个像超级马里奥那种平台跳跃游戏也不需要判断马里奥脚上是否踩到地啦?跳的时候是不是头顶到地板啦?这种种复杂的情况,一个精灵设置了body,它就是一个硬硬的砖头,你只要掩码设好无论如何也穿不过去的。回到刚才人碰到金币的例子,如金币这种我们希望人碰到金币就Money + 1,并且金币消失,那么,就把金币和人的不论类别掩码还是ContactTest掩码都设为1,这样就瞎猫碰到死耗子一样触发了碰撞响应函数,在响应函数里再设置人的money++并且金币消失,也就达到了我们的效果

cocos2dx physics物理引擎 碰撞的三个掩码含义的更多相关文章

  1. ios – 仅用于碰撞检测,Chipmunk或Box2d是更好的工具吗?

    对于基于Cocos2d的项目,我只想使用物理工具包进行碰撞检测.使用Chipmunk或Box2d有什么优缺点?解决方法我们在谈论什么样的碰撞?根据什么使你更容易使用你的决定而不是一个任意的,未定义的,高度主观的关于一个物理引擎是否比另一个更好的想法,因为技术差异是微不足道的,你只能评估他们对如果你们都知道你自己的游戏设计和物理引擎内部算法,你的游戏设计真的很好.

  2. Swift中的UIKit重力学

    实例化UIDynamicAnimator时,它的构造函数需要传入一个referenceView参数,用于告知它要跟踪并制定坐标的View。collision.translatesReferenceBoundsIntoBoundary=true//为碰撞效果中添加一个隐形的边界。UITouchsnap=UISnapBehavioranimator.addBehavior}//自定义行为:UIDynamcItemBehaviorletitemBehavIoUr=UIDynamicItemBehaviorite

  3. Swift中的UIKit动力学

    添加重力行为在ViewController.swift文件中添加两个属性://UIKit物理引擎varanimator:UIDynamicAnimator!在UIKit的重力世界中,计算重力加速度的公式是一样的,但是单位有所不同。从上面代码我可以注意到collision.translatesReferenceBoundsIntoBoundary=true;这行代码,它的意思是将UIDynamicAnimator引用的View的边界作为碰撞行为的触发边界,这样就不用我们再去设置边界的坐标了,非常好用。

  4. 怎样在CocosCreator中使用物理引擎关节

    这篇文章主要介绍了怎样在CocosCreator中使用物理引擎关节,对物理引擎感兴趣的同学,着重要看一下

  5. cocos2d_x_02_使用内置物理引擎

    最终效果图:一、新建工程进入cocos2d-x的tools下的bin目录:/Users/beyond/Desktop/cocos2d-x/cocos2d-x-3.3beta0/tools/cocos2d-console/bin目录打开终端,切换到上述bin目录使用cocos命令,创建工程,格式如下:cocosnew工程名-p包名-l语言-d目标文件夹,例如:cocosnew01_cocos2d-x

  6. Cocos2D OR libgdx for Android游戏开发

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. cocos2d-x 物理引擎

    上面的例子代码流程:PhysicsBody对象创建Sprite对象创建PhysicsBody对象以组件的形式被添加到Sprite对象创建监听器以响应onContactBegin()事件刚体刚体描述了抽象物体的物理属性,包括:质量、位置、旋转角度、速度和阻尼。Cocos2d-x用PhysicsBody对象表示刚体。PhysicsWorld物理世界PhysicsWorld与场景进行了深入的整合,只需要调用Scene对象的initWithPhysics()方法,就可以创建一个包含物理世界的场景,注意在初始化的时

  8. 【Cocos Creator实战教程(8)】——打砖块(物理引擎)

    新建一个工程,取名叫做brick-breaker,brick是什么意思呢,就是砖块的意思,每次给工程起名字,我都能学会一个新单词。为什么不选kinematic呢?另外要设置wall,ground,paddle,brick的type为staticbrick的tag为1,ground的tag为2,paddle的tag为3,wall的tag位4下面来看脚本BrickLayout.js12345678910111213141516171819202122自己写了一个动态添加砖块的布局脚本,传入需要添加的砖块数量就

  9. Cocos2d-x之初级物理引擎

    一切故事发生的背景同济大学软件学院每个学期会要求学生独立或者组队完成一个大项目,于是2016年的大项目是用cocos2d-x这款引擎制作一个自己的游戏。之前写了一篇cocos2d-x关于键盘按住事件的教程,不足之处还请大家多多指出。物理引擎的基础两种物理引擎根据官方文档的介绍,目前有两大重要的物理引擎,Box2D和Chipmunk,并且cocos2d-x已经集成了它们,在3.x版本中可基于Chipmunk的核心API的物理引擎使用。一句话:cocos2d-x3.x版本中使用Chipmunk物理引擎更加方便

  10. 关于cocos2d中物理引擎碰撞掩码的设置

    当物理引擎检测到两个Body发送的碰撞信息后,会调用相应的时间方法来通知系统,比如两个Body已经发生碰撞,两个Body已经分离。同时导弹、飞船以及七边形只要碰撞都可以调用onContactBegin的方法注:会遇到使用默认值无法调用onContactBegin的方法,解决办法是对每个body重新设置三个掩码就能解决

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部