我遵循Sprite Kit指南,并且在场景编辑器中要求我将“类别蒙版”设置为32,将“碰撞蒙版”设置为11。这些数字有何关系?

最佳答案

  • 类别位掩码告诉Sprite-Kit这是什么类型的对象。
  • 碰撞位掩码告诉Sprite Kit该对象是什么对象
    发生碰撞(即会击中并反弹)。
  • ContactTest位掩码告诉Sprite-Kit您想要哪些联系人
    当该对象接触到另一个对象时,将收到通知。

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

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

    例如。在您的场景中,您有一个玩家,一个导弹,一个敌人和一个屏幕边缘。我们假设位掩码是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位)。 flictionBitMask为11,即8 + 4 + 1,因此在二进制中为“00001101”,这意味着它与categoryBitMask为8、4或1的对象发生碰撞,因此我假设场景中存在这些categoryBitMasks的对象。

    默认情况下,所有其他东西都会反弹,即crashBitMask都为'1',即b'111111 ..',并且没有任何通知通知与其他任何事物的联系,即contactTestBitMask都为'0'。

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

    关于ios - Sprite Kit的 “Category Mask”和 “Collision Mask”是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40593678/

    10-09 02:31