cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBit...(转)

时间 2014-06-21 20:20:10  CSDN博客原文  http://blog.csdn.net/u010019717/article/details/32942641

转载请注明出处:游戏开发实验室 http://blog.csdn.net/u010019717/article/details/32942641

我在编写游戏的时候遇到了这个问题,  物理引擎其他的内容还好理解,  就这三个函数就是没找到有人详细的解释一下。  我不知道这个都没弄明白,游戏是怎么做出来的。那我就不吐糟了,      下面的所有内容都是我的个人推断。不知道正不正确。    反正我目前是这么理解的。

我们先来看看这三个函数的定义:

/**

* A mask that defines which categories this physics body belongs to.

* Every physics body in a scene can be assigned to up to 32 different categories, each corresponding to a bit in the bit mask. You define the mask values used in your game. In conjunction with the collisionBitMask and contactTestBitMask properties, you define which physics bodies interact with each other and when your game is notified of these interactions.

* The default value is 0xFFFFFFFF (all bits set).

*/

/** 定义了这个物理刚体是属于哪个类别的掩码 。在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数

int bitmask是int类型4个字节32位

),每个对应有32位中的1位掩码。您的游戏中您定义使用的掩码值。联同的 collisionBitMask 和 contactTestBitMask 的属性,定义哪些物理刚体彼此之间进行交互和何时你接收到这些交互作用的通知。默认值为的 0xFFFFFFFF (所有的位都被设置)。

*/

inline void setCategoryBitmask(int bitmask) { _categoryBitmask = bitmask; }

/**

* A mask that defines which categories of bodies cause intersection notifications with this physics body.

* When two bodies share the same space, each body’s category mask is tested against the other body’s contact mask by performing a logical AND operation. If either comparison results in a non-zero value, an PhysicsContact object is created and passed to the physics world’s delegate. For best performance, only set bits in the contacts mask for interactions you are interested in.

* The default value is 0x00000000 (all bits cleared).

*/

/**

一个掩码,

它定义了哪些类别的刚体与此物理刚体产生交集(相互作用)的通知

。当两个刚体共有同一个空间时,通过执行逻辑与运算每个刚体的类别掩码被检测测试反对其他的刚体的接触掩码。如果任一比较结果在一个非零值,一个 PhysicsContact 对象被创建并传递到物理世界的委托。为获得最佳性能,仅设置您感兴趣的互动相互作用的接触掩码位。默认值为 0x00000000 (所有位均被清除)。

*/

inline void setContactTestBitmask(int bitmask) { _contactTestBitmask = bitmask; }

/**

* A mask that defines which categories of physics bodies can collide with this physics body.

* When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a non-zero value, then this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.

* The default value is 0xFFFFFFFF (all bits set).

*/

/**

一个掩码,

它定义了哪些类别的物理刚体可以与这物理刚体发生碰撞

。当两个物理刚体互相接触时,可能会发生冲突。这个刚体的碰撞掩码被相比其他刚体的类别掩码通过执行按位逻辑与运算。如果结果是一个非零值,则这一刚体被受碰撞。每个刚体独立地选择是否愿意受其他刚体的影响。例如,您可能会使用这来避免碰撞计算使对刚体的速度的变化可以忽略。默认值为的 0xFFFFFFFF (所有的位设置)。

*/

inline void setCollisionBitmask(int bitmask) { _collisionBitmask = bitmask; }

inline int getCollisionBitmask() const { return _collisionBitmask; }

每个函数说了这么多,那么具体是什么意思呢?  看看下面的例子:

box1->getPhysicsBody()->setCategoryBitmask(0x01); // 0001

box1->getPhysicsBody()->setContactTestBitmask(0x04); // 0100

box1->getPhysicsBody()->setCollisionBitmask(0x03); // 0011

box2->getPhysicsBody()->setCategoryBitmask(0x02);    // 0010
box2->getPhysicsBody()->setContactTestBitmask(0x08); // 1000
box2->getPhysicsBody()->setCollisionBitmask(0x01);   // 0001

box3->getPhysicsBody()->setCategoryBitmask(0x04);    // 0100
box3->getPhysicsBody()->setContactTestBitmask(0x01); // 0001
box3->getPhysicsBody()->setCollisionBitmask(0x06);   // 0110

box1 和 box2 发生碰撞

box1 box3  不会

box2 box3 也不会

为什么呢?    解释如下:

box1的类别掩码 00000000 00000000 00000000 00000001

可接到通知         00000000 00000000 00000000 00000100

允许撞我            00000000 00000000 00000000 00000011

box2的类别掩码  00000000 00000000 00000000 00000010

可接到通知         00000000 00000000 00000000 00001000

允许撞我             00000000 00000000 00000000 00000001

box3的类别掩码  00000000 00000000 00000000 00000100

可接到通知          00000000 00000000 00000000 00000001

允许撞我             00000000 00000000 00000000 00000110

现在做运算呗:

box1的允许撞我     00000000 00000000 00000000 00000011    与box2的类别掩码做按位与运算

box2的类别掩码     00000000 00000000 00000000 00000010

结果为:                00000000 00000000 00000000 00000010      不为0,  box1会撞到box2撞到。

同理:

box2的允许撞我     00000000 00000000 00000000 00000001    与box1的类别掩码做按位与运算

box1的类别掩码     00000000 00000000 00000000 00000001

结果为:                00000000 00000000 00000000 00000001      不为0,  box2会撞到box1撞到。

他们会相互受到撞击的。

box2的允许撞我与box3的类别掩码  按位与运算为0;

box3的允许撞我与box2的类别掩码  按位与运算为0;

box1的允许撞我与box3的类别掩码  按位与运算为0;

box3的允许撞我与box1的类别掩码  按位与运算为0;

所以:

box1 and box2 发生碰撞

but the box1 box3  不会

the box2 box3 也不会

时间: 2024-08-02 12:04:40

cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBit...(转)的相关文章

cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()

转载请注明出处:游戏开发实验室http://blog.csdn.net/u010019717/article/details/32942641 我在编写游戏的时候遇到了这个问题,  物理引擎其他的内容还好理解,  就这三个函数就是没找到有人详细的解释一下.  我不知道这个都没弄明白,游戏是怎么做出来的.那我就不吐糟了,      下面的所有内容都是我的个人推断.不知道正不正确.    反正我目前是这么理解的. 我们先来看看这三个函数的定义: /** * A mask that defines w

cocos2d-x3.0 Physics新的物理引擎

1.说明: 3.0以后将box2d和chipmunk这两个物理引擎进行了封装,使用起来很的便利 2.详细用法: 1.创建物理世界场景 auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); //调试时使用 2.在场景中加入重力 Vect gravity = Vect(0.0f, -10.0f); //-10表示重力向下 sc

cocos2dx3.X项目重写(二)新的物理引擎

新的物理引擎叫physicsBody 创建物理scene auto scene = Scene::createWithPhysics(); 添加调试信息 这样可以让刚体附加方框显示出来 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); 创建边界框 void Stage::addEdgeBox() { auto visibleSize = Director::getInstance()->get

vue-cli3.0 脚手架搭建项目的过程详解

1.安装vue-cli 3.0 ? 1 2 3 npm install -g @vue/cli # or yarn global add @vue/cli 安装成功后查看版本:vue -V(大写的V) 2.命令变化 ? 1 vue create --help 用法:create [options] <app-name> 创建一个由 `vue-cli-service` 提供支持的新项目 选项: -p, --preset <presetName>       忽略提示符并使用已保存的或

vue2.0 中#$emit,$on的使用详解

vue1.0中 vm.$dispatch 和 vm.$broadcast 被弃用,改用$emit,$on 1. vm.$on( event, callback ) 监听当前实例上的自定义事件.事件可以由vm.$emit触发.回调函数会接收所有传入事件触发函数的额外参数. 1 vm.$emit( event, [-args] ) 触发当前实例上的事件.附加参数都会传给监听器回调. 例子: 1 //父组件 2 <template> 3 <ratingselect @select-type=&

Cocos2d-x 3.0 简捷的物理引擎

Cocos2d-x 3.0 开发(九)使用Physicals取代Box2D和chipmunk http://www.cocos2d-x.org/docs/manual/framework/native/physics/physics-integration/zh  -- 官网+Demo 水墨鱼的专栏 http://www.cocos2d-x.org/docs/catalog/zh --- 官方 搭"server" 须要哪些知识 -- 看搭建什么server了. 9秒论坛,有非常多游戏s

【 DCOS 】织云 CMDB 管理引擎技术详解

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者 : 李琦 , 腾讯高级工程师 , 就职于网络平台部.曾负责公司海量运营系统的规划设计,如 TMP.Sniper.GSLB.IDCSpeed.IDCProbe 等网络运营平台,以及参与腾讯云云主机.云网络.云安全等基础产品规划和大客户的需求管理.目前主要聚焦在私有云基础架构的统一监管控,把腾讯基础架构的自动化管理能力以产品化方式输出. 引言 云计算经过多年的发展,逐渐从概念到渐为人认知.到接受.到现在全行业拥抱上云,云的客户也从最

5.hadoop流原理、实例和新旧API下Wordcount详解

前四篇文章讲了Hadoop的配置和测试以及eclipse下的使用,有兴趣的可以先看下. 1.Hadoop流简介 用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出. 当一个可执行文件作为Mapper时,每一个Map任务会以一个独立的进程启动这个可执行文件,然后在Map任务运行时,会把输入切分成行提供给可 执行文件,并作为它的标准输入(stdin)内容.当可执行文件运行出结果时,Map从标准输出(stdout)中收集数据,并将其转化 为<key, value>对

Cocos2d之Ref类与内存管理使用详解

一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被任何引用变量(类似于C和C++的指针)引用时,JVM会将对象释放掉.C++和C一样,是编译后能够直接被操作系统执行的语言,没有虚拟机负责其内存管理,因此需要在程序中管理内存.本文主要介绍如何使用cocos2d提供的内存管理机制. Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管