类别位掩码在 SpriteKit 中如何工作?(0xFFFFFFFF)

How does the category bit mask work in SpriteKit?(0xFFFFFFFF)

我无法理解这个位掩码的工作原理。 我知道这默认设置为 0xFFFFFFFF,如果你想让两个主体联系你设置两个不同的位掩码。

我的问题是如何设置 2 个(或更多)不同的位掩码,如何更改默认值以获得不同的值? 我知道有 32 个不同的类别。你能给我一些吗?

类别

您可以有 32 个不同的类别。类别可以是容器、子弹、墙壁、敌人等)。如果您对碰撞和接触感兴趣,那么您首先需要为给定的对象设置一个类别。例如,容器类别 0,子弹类别 1,墙类别 2,敌人类别 3。由于它们是位掩码,因此您(分别)有 1、2、4、8。 现在类别更多的是行为问题而不是身份问题。有些对象可能表现得像两个不同的类别:岩石(没有类别 per-se)表现得像墙(你在上面弹跳)和敌人(你可以向它们投掷子弹)。那么岩石的类别将是 2 和 3,因为位掩码给出了 12。很难想象一个对象属于不同的类别,但是如果你考虑行为集而不是身份集,那么就很容易想到它.

掩码的默认值为 0xFFFFFFFF,这意味着每个对象都在每个可能的类别中,并且每个对象都相互碰撞。 微调这些值可以显着改善物理引擎。

碰撞

碰撞用于定义物理世界中哪些对象发生碰撞。一些物体可能会相互交叉,而其他物体会弹跳。示例:魔法子弹可能会穿墙,而普通子弹会停在墙上。

magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2

ordinaryBullet.physicsBody.collisionBitMask = 2 // hits walls
magicBullet.physicsBody.collisionBitMask = 0 // do not physically see walls

碰撞被声明为位掩码,因为您必须声明给定对象能够与哪些其他类别进行物理交互。

联系人

接触与碰撞完全相同,但要在您的代码中捕获 两个对象接触的事实。所以如果你对普通的子弹打墙感兴趣(魔法不一定有趣):

ordinaryBullet.physicsBody.contactTestBitMask = 2 // want to catch wall hit
magicBullet.physicsBody.contactTestBitMask = 0 // don't bother

稍微复杂一点的例子

现在,如果你添加另一种对象,比如硬墙,那可能会得到:

magicBullet.physicsBody.categoryBitMask = 1
ordinaryBullet.physicsBody.categoryBitMask = 1 // both bullets behave as bullets
wall.physicsBody.categoryBitMask = 2 // some bullets may travel through
hardWall.physicsBody.categoryBitMask = 4 // nothing can travel through thses

ordinaryBullet.physicsBody.collisionBitMask = 6 // hits walls and hard walls
magicBullet.physicsBody.collisionBitMask = 4 // do not physically see walls but only hard walls

ordinaryBullet.physicsBody.contactTestBitMask = 6 // want to catch all wall hit
magicBullet.physicsBody.contactTestBitMask = 4 // just want to catch hard wall hitting