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

我在编写游戏的时候遇到了这个问题。  物理引擎其它的内容还好理解。  就这三个函数就是没找到有人具体的解释一下。  我不知道这个都没弄明确。游戏是怎么做出来的。那我就不吐糟了,      以下的全部内容都是我的个人判断。

不知道正不对。    反正我眼下是这么理解的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDAxOTcxNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

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

/**

     * 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; }

    inline int getCategoryBitmask() const { return _categoryBitmask; }

    /**

     * 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; }

    inline int getContactTestBitmask() const { return _contactTestBitmask; }

    /**

     * 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 也不会




版权声明:本文博客原创文章。博客,未经同意,不得转载。

cocos2d-x3.0 解释具体的新的物理引擎setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()的更多相关文章

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

    1.说明: 3.0以后将box2d和chipmunk这两个物理引擎进行了封装,使用起来很的便利 2.详细用法: 1.创建物理世界场景 auto scene = Scene::createWithPhy ...

  2. 如何在Cocos2D 1.0 中掩饰一个精灵(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...

  3. 如何在Cocos2D 1.0 中掩饰一个精灵(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 让我们开始吧 打开Xcode,从New Project中选择co ...

  4. Mysql8.0.11简介,新特性

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...

  5. C# 9.0中引入的新特性init和record的使用思考

    写在前面 .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过 ...

  6. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

  7. Docker 1.12.0将要发布的新功能

    Docker 1.12.0将要发布的新功能 导读 按计划,6/14 是1.12.0版本的 feature冻结 的日子,再有两个星期Docker 1.12.0也该发布了.这里列出来的新功能,都是已经合并 ...

  8. Jdk5.0中出现的新特性

    掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...

  9. C#6.0 中的那些新特性

    C#6.0 中的那些新特性 前言 VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些 ...

随机推荐

  1. OCP读书笔记(18) - 空间管理

    OLTP 表压缩 压缩始终是非常占用CPU的过程,并且需要花费一定时间,通常,如果压缩数据,则数据必须解压缩后才能使用.虽然此要求在数据仓库环境中是可以接受的但在OLTP环境中可能无法接受 现在,在O ...

  2. PHP类中的七种语法说明

    类中的七种语法说明 -属性 -静态属性 -方法 -静态方法 -类常量 -构造函数 -析构函数 <?php class Student { // 类里的属性.方法和函数的訪问权限有 (函数和方法是 ...

  3. cocos2d-html5游戏图片资源选择

    cocos2d-html5游戏图片资源能够选择,单张的图片作为一个精灵或者场景的载入对象.也能够把图片给做成plist文件.通过plist来訪问图片资源.其中优缺点.使用方式在个人的測试其中体现例如以 ...

  4. 作为一个.net程序猿,需要掌握这些有点前途的人才,一些开发---Shinepans

    1.基础 C#基础                    参考书目:   <c#入门经典>         <ASP.NET揭秘> IIS  HTML              ...

  5. 期望dp专题

    一直不明白为什么概率是正推,期望是逆推. 现在题目做多了,慢慢好像有点明白了 poj2096 收集bug,  有n个种类的bug,和s个子系统.  每找到一个bug需要一天. 要我我们求找到n个种类的 ...

  6. android一些面试题目

    1.ListView怎么提高滑动效率 2.说下你做过项目的包的构架,(联网,解析,activity,database) 重点 3.载入大量图片怎么做(包含小图和查看大图) 怎么降低一次跟server的 ...

  7. C# 引用类型与值类型的区别

    //引用类型(使用了class) class SomeRef{public Int32 x;} //值类型(使用了struct) struct SomeVal{public Int32 x;} sta ...

  8. 【C语言探险】 第四课的第二部分:串

    内容简单介绍 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每个部分结束后都会有练习题,并会发布答案.还会带大家用C语言编写三个游戏. ...

  9. veridata实验例(3)验证veridata发现insert操作不会导致同步

    veridata实验例(3)验证veridata发现insert操作不会导致同步 续接:<veridata实验举例(2)验证表BONUS与表SALGRADE两节点同步情况>,地址:点击打开 ...

  10. 面向对象的方式进行数据交换网络之间的差异--无缝切换的发展到单机游戏C/S模式

    上一页本文描述描述有关数据的发展过程之间的差异支撑点,这里展示的另一个特点:无缝切换的发展,以独立C/S模式 一般C/S模式都面临一个问题: 就是开发过程中的调试难题,由于涉及到client和服务端相 ...