什么是精灵套装"类别面具"和"碰撞面具"?

时间:2016-11-14 16:40:21

标签: ios macos sprite-kit

我正在关注Sprite Kit指南,并在场景编辑器中要求我将Category Mask设置为32,将Collision Mask设置为11.这些数字如何相关?

1 个答案:

答案 0 :(得分:8)

类别位掩码告诉Sprite-Kit这是什么类型的对象。 碰撞位掩码告诉Sprite Kit此对象与之碰撞的对象(即将命中和反弹)。 ContactTest位掩码告诉Sprite-Kit您想要通知哪些联系人,即此对象何时触及另一个对象。

Sprite-Kit游戏引擎自动处理冲突;联系人由您的代码处理 - 当您感兴趣的联系人发生时,您的代码(Swift 2的didBeginContact',Swift 3及更高版本的'didBegin(contact:))将被调用。

您需要以二进制的方式考虑这些,为简单起见,我们将从简单的类别位掩码开始,即场景中的每个对象只属于一个类别。

E.g。在你的场景中你有一个玩家,一个玩家导弹,一个敌人和一个屏幕边缘。我们假设位掩码是8位而不是32位。将每个数字视为8个二进制数字(8位)的范围,每个数字为0或1.

场景中的对象必须具有唯一的类别,因此我们将按如下方式分配它们:

player.categoryBitMask        = 00000001  (1 in decimal)
playerMissile.categoryBitMask = 00000010  (2 in decimal)
enemy.categoryBitMask         = 00000100  (4 in decimal)
screenEdge.categoryBitMask    = 00001000  (8 in decimal)

如果你使用十进制数字,而不是2的幂(1,2,4,8,16,32,64,128等),那么在类别位中将设置多于1位使事情复杂化的掩码(这意味着该对象属于多个类别),并且您的代码必须变得更复杂。

现在考虑一下(碰撞)的反弹。让我们说除了导弹穿过屏幕边缘外,其他一切都会反弹。

每个对象的冲突位掩码由表示该对象碰撞的对象的位组成,例如:

player.collsionBitMask         = 00001111 (15 in decimal) (the bits for all other objects are set)
playerMissile.collisionBitMask = 00000111 (7) (all object EXCEPT screenEdge)
enemy.collisonBitMask          = 00001111 (15) (everything)
screenEdge.collisonBitMask     = 00000000 (0) (collides with nothing)

现在我们考虑一下我们感兴趣的对象交互。我们想知道何时:

  • 玩家和敌人触摸
  • 敌人和玩家触碰或敌人以及玩家的导弹触碰。

这表示为:

player.contactTestBitMask = 00000100 (4) (the enemy's categoryBitMask)
enemy.contractTestBitMask = 00000011 (3) (the player's categoryBitMask combined with the missile's categoryBitMask))

注意,如果你想知道A和B何时触摸,只需要让A的contactTestBitMask(CTBM)包含B的categoryBitMask;你也不必将B的CTBM设置为A的类别。但是如果你希望它们互相反弹,那么每个对象的collisionBitMask必须包含另一个的categoryBitMask。如果A的collisonbitMask包含B的类别,但反之亦然,那么当2碰撞时,A将反弹但B将不受其影响。

对于您的具体示例,(类别掩码为32,冲突掩码为11),categoryBitMask为32,即00100000(仅粘贴8位)。 collisionBitMask是11,即8 + 4 + 1,所以在二进制中这是'00001101',这意味着它与categoryBitMask为8,4或1的对象发生碰撞,所以我假设你的场景中有这些categoryBitMasks的对象。

默认情况下,所有内容都会反弹,即collisionBitMask全部为'1',即b'111111 ..'并且没有任何其他内容通知联系人,即contactTestBitMask全部为'0'。

此外 - 所有这些都适用于physicsBodies,而不是节点。