SpriteKit 关于categoryBitMask collisionBitMask contactTestBitMask 遇到的一些问题

时间:2023-12-04 16:32:14

手写copy一下官方解释

首先是categoryBitMask

/** 定义了这个物理刚体是属于哪个类别的掩码 。在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数 int bitmask是int类型4个字节32位),每个对应有32位中的1位掩码。您的游戏中您定义使用的掩码值。联同的 collisionBitMask 和 contactTestBitMask 的属性,定义哪些物理刚体彼此之间进交互和何时你接收到这些交互作用的通知。默认值为的 0xFFFFFFFF (所有的位都被设置).

*/

个人理解:你所创建的sprite是个啥(比如游戏里中的一个人物,命名person),用一位掩码来表示。如可以用掩码 0x01来表示(0001) categoryBitMask = 0x01 ;

collisionBitMask

/**

一个掩码,

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

*/

个人理解:哪些sprite可以与当前这个sprite(比如游戏里的一个怪物,命名zom)发生物理碰撞,用一位掩码来表示。如可以用掩码 0x02来表示(0010) collisionBitMask = 0x02;

按位逻辑与运算 ,拿上述俩个sprite举例。  0001  0010  运算结果为 0 ,说明zom不响应person的碰撞。 反之亦然。

不过这里有个问题,如何判断俩个物体谁碰撞的谁。

如设置 墙体的 collisionBitMask = 0x01; categoryBitMask = 0x01;

设置人物的     collisionBitMask = 0x03; categoryBitMask = 0x03;可以相互发生碰撞  0001  0011 -->  不为0

如设置人物     collisionBitMask = 0x02, categoryBitMask = 0x03;  人物移动,不与墙体发生碰撞。

如设置人物     collisionBitMask = 0x03, categoryBitMask = 0x02;   人物移动,与墙体发生碰撞。

以上俩中计算方法都是用人物的collisionBitMask与墙体的categoryBitMask进行计算,所以可以理解为是墙体碰撞的人物吗?

//////////////更新下理解

//body.categoryBitMask = 0;  <类别掩码,为0时代表我谁也碰撞不了>
//body.contactTestBitMask = 0; <碰撞检测掩码,为0时代表不触发检测>
//body.collisionBitMask = 0;  <允许碰撞掩码,为0时代表谁也碰撞不了我>
//想要发生碰撞,需要 categoryBitMask & collisionBitMask 运算,为非0,可以发生碰撞

假设俩个sprite A:B , A.categoryBitMask & B.collisionBitMask 为非0且 B.categoryBitMask & A.collisionBitMask也为非0,可以发生碰撞,相同加速度情况下,碰撞结果取决于物理体积

假设俩个sprite A:B , A.categoryBitMask & B.collisionBitMask 为0 但 A.collisionBitMask & B.categoryBitMask为非0,可以发生碰撞,但碰撞结果与上面不同,可以理解为,发生碰撞的时候,只考虑B的碰撞体积,把A的碰撞体积假设成0(虽然不是0),虽然发生碰撞,但是A碰撞B时候B是不会动的,B碰撞A的时候,只考虑B的碰撞体积,会把A碰撞开(这里A被碰撞开位移的大小与速度也与A的物理体积有关)。  反之亦然。

以上如有问题,希望大家帮忙指正。