cocos2dx 物理碰撞

编程之家收集整理的这篇文章主要介绍了cocos2dx 物理碰撞编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

https://www.cnblogs.com/JiaoQing/p/3906780.html

四个响应函数

 1 EventListenerPhysicsContact* evContact = EventListenerPhysicsContact::create();//创建一个物理世界的碰撞事件
 2     evContact->onContactBegin = [](PhysicsContact& contact)
 3     {
 4         CCLOG("Begin!\n");
 5         return true;
 6     };
 7     evContact->onContactPreSolve = [](PhysicsContact& contact,PhysicsContactPreSolve& solve)
 8     {
 9         CCLOG("PreSolve!\n");
10         return true;
11     };
12     evContact->onContactPostSolve = [](PhysicsContact& contact,const PhysicsContactPostSolve& solve)
13     {
14         CCLOG("PostSolve!\n");
15     };
16     evContact->onContactSeperate = [=](PhysicsContact& contact)//函数在两个碰撞的刚体分离后调用
17     {
18         CCLOG("Seperate!\n");
19         auto bodyA = (Sprite*)(contact.getShapeA()->getBody()->getNode());//两个碰撞刚体相对应的节点之A
20         auto bodyB = (Sprite*)(contact.getShapeB()->getBody()->getNode());//两个相碰撞刚体对应节点之B
21         if(!bodyA||!bodyB)//按理说碰撞发生之后不会发生有一个刚体的节点不存在的情况,但是实际测试时发现bodyA或bodyB有为NULL的情况,因此我们在这里做一个判断排除节点为空的情况
22             return;
23         int tagA = bodyA->getTag();
24         int tagB = bodyB->getTag();
25         if(tagA == 3)
26         {
27             bodyA->removeFromParentAndCleanup(true);
28         }
29         if(tagB == 3)
30         {
31             bodyB->removeFromParentAndCleanup(true);
32         }
33     //    prop->setVisible(true);
34     };
35     _eventDispatcher->addEventListenerWithSceneGraPHPriority(evContact,this);//注册碰撞事件

 

分享图片

 

1:接触测试掩码 ContactTestBitmask(默认值:0xFFFFFFFF)

2:类别掩码 CategoryBitmask (默认值:0x00000000)

3:碰撞掩码 CollisionBitmask (默认值:0xFFFFFFFF)

 

    只有两者的接触测试掩码执行“逻辑与”运算,如果结果为非0值,表明这两个物体会触发碰撞检测事件,

也就是会执行onContactBegin和onContactSeperate函数

    假设有三个物体(body1、body2、body3),设置接触测试掩码如下:

body1->setContactTestBitmask(0x01)  //0001

body2->setContactTestBitmask(0x03)  //0011

body3->setContactTestBitmask(0x02)  //0010

body1和body2,以及body2和body3是可以触发碰撞检测事件的,会执行会执行onContactBegin和onContactSeperate函数

而body1和body3是不能的,上面的四个函数也不会执行。

 

   对于类别掩码和碰撞掩码,他们的作用是检测两个物体接触时是否发生“碰撞反应”。“碰撞反应”会表现为一个物体受到另外

物体的碰撞,而改变运动方向。由于两个物体是“刚体”,在碰撞时两个物体不会交叉。

   类别掩码:定义了一个物体所属类别,每一个物体在场景中能被分配到多达32个不同的类别。

   碰撞掩码:当两个物体接触时,改物体的碰撞掩码与另一个物体的类别掩码执行“逻辑与”运算,如果结果为非0值,

该物体能够对另一个物体的碰撞发生反应。会执行onContactPostSolve和onContactSeperate函数(前提是碰撞检测事件会触发,

也就是上面说的ContactTestBitmask进行逻辑与为非0),

 

经测试:

1:ContactTestBitmask逻辑与非0    ContactTestBitmask和ContactTestBitmask逻辑与非0

      上述四个函数均会触发(前提是前两个函数返回都为true),也会产生“碰撞反应”:

2:ContactTestBitmask逻辑与:0    ContactTestBitmask和ContactTestBitmask逻辑与非0

      上述四个函数均不会触发,会产生“碰撞反应”:     

3:ContactTestBitmask逻辑与非0    ContactTestBitmask和ContactTestBitmask逻辑与为0

      上述四个函数均会触发(前提是前两个函数返回都为true),不会产生“碰撞反应”(就是会直接穿过,交叉);

4:ContactTestBitmask逻辑与为0    ContactTestBitmask和ContactTestBitmask逻辑与为0

      上述四个函数均不会触发,不会产生“碰撞反应”(就是会直接穿过,交叉);

总结

以上是编程之家为你收集整理的cocos2dx 物理碰撞全部内容,希望文章能够帮你解决cocos2dx 物理碰撞所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群
编程之家官方2群
编程之家官方3群
编程之家官方4群

相关文章

猜你在找的Cocos2d-x相关文章

操作步骤 1、创建cocos2d-x工程 2、新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__#in
开发环境:OS(WINDOWS 8.1 X64 企业版) cocos2d-x 2.2.1 vs2010 想给vs安装上cocos的模版,执行InstallWizardForVS2010.js,老是提示
https://www.cnblogs.com/JiaoQing/p/3906780.html 四个响应函数 1 EventListenerPhysicsContact* evContact = EventListenerPhysicsContact::create();//创建一个物理世界的碰撞事件 2 evContact->onContactBegin = [](PhysicsCo
转载于 http://www.cnblogs.com/kenkofox/p/3926797.html 熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法。 cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManager.addListener({ event: cc.EventListener.KEY
公共资源加载,缓存retain;防止被自动销毁 2. 数字滚动递增;用于得奖后,总金币跳动增加 3. 四舍五入显示 金币数 4.   5.  6. 加载csv 配置文件
title Map 使用box2d var sfloors = this.tiledMap.getObjectGroup(‘Special_Floor‘).getObjects(); //此处获取对象层 for (let i = 0, l = sfloors.length; i < l; i++) {   let sfloorsgNode = sfloors[i];   let compoent
摘要: 对在quick-cocos2d-x上实现的资源加密方法的补充 前篇: quick-cocos2d-x图片资源加密 让quick-cocos2d-x支持加密的plist文件   通过前篇的修改,我们已经能够在Windows平台的player,以及Android上使用加密的常见格式(png、jpg等)的图片资源了。不过,在MAC上的player,以及IOS上,加载资源时调用的是另外的代码,所以
首先将存放图片最外层文件夹命名为resources    changeBj: function(){     var url = ‘globalUI/video/gVideoPlayClick‘;     var _this = this; cc.loader.loadRes(url,cc.SpriteFrame,function(err,spriteFrame)     {         _t
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注