SKPhysicsBody避免碰撞Swift/SpriteKit

SKPhysicsBody避免碰撞Swift/SpriteKit,swift,sprite-kit,physics,Swift,Sprite Kit,Physics,我的场景中有3个SKSpriteNodes。一只鸟,一枚硬币和场景周围的一条边界。我不希望硬币和鸟相撞,而希望它们与边界相撞。 我为每个节点分配不同的collisionBitMask和categoryBitMask: enum CollisionType:UInt32{ case Bird = 1 case Coin = 2 case Border = 3 } 像这样: bird.physicsBody!.categoryBitMask = CollisionTyp

我的场景中有3个SKSpriteNodes。一只,一枚硬币和场景周围的一条边界。我不希望硬币和鸟相撞,而希望它们与边界相撞。 我为每个节点分配不同的collisionBitMask和categoryBitMask:

enum CollisionType:UInt32{
    case Bird  = 1
    case Coin = 2
    case Border = 3 
}
像这样:

bird.physicsBody!.categoryBitMask = CollisionType.Bird.rawValue
bird.physicsBody!.collisionBitMask = CollisionType.Border.rawValue

coin.physicsBody!.categoryBitMask = CollisionType.Coin.rawValue
coin.physicsBody!.collisionBitMask = CollisionType.Border.rawValue
但是硬币和鸟仍然相互碰撞。
我做错了什么?

位掩码位于32位。像您那样声明它们对应于:

enum CollisionType:UInt32{
    case Bird = 1 // 00000000000000000000000000000001
    case Coin = 2 // 00000000000000000000000000000010
    case Border = 3 // 00000000000000000000000000000011
}
您要做的是将边界值设置为4。要改为使用以下位掩码:

enum CollisionType:UInt32{
    case Bird = 1 // 00000000000000000000000000000001
    case Coin = 2 // 00000000000000000000000000000010
    case Border = 4 // 00000000000000000000000000000100
}
请记住,下一个位掩码必须遵循相同的操作:8、16、。。。等等

编辑:

此外,您可能希望使用结构而不是枚举,并使用另一种语法来简化它(这不是强制性的,只是偏好问题):

您可以这样使用:

bird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
bird.physicsBody!.collisionBitMask = PhysicsCategory.Border

coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
coin.physicsBody!.collisionBitMask = PhysicsCategory.Border

非常感谢你!我是这个话题的新手。你可以给我一些链接或关键字,让我可以找到更多关于“UInt32=0b100”之类的信息吗?不客气。语法是“位移位”,也许苹果的文档()太复杂了,无法开始。但是,基本思想是初始位(1)表示为:00000000000000000000000000000001。如果您使用此语法
0b10
或此语法
0x1将其从一位移到另一位,例如,如果我需要另一个物理类别,我可以执行
静态let Board:UInt32=0b1000//8
对吗?对不起,我正在回答其他问题并试图为您制作一个表格。所以这些都是比特,如果需要,可以在互联网上搜索。但要回答你的问题:是的,你会这么做。这张桌子是我为你做的,它可能会帮助你更好地理解:哇!!男人们,你们太棒了!!!非常感谢你的工作。由于您的表格,我现在了解了位移位的原理。
bird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
bird.physicsBody!.collisionBitMask = PhysicsCategory.Border

coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
coin.physicsBody!.collisionBitMask = PhysicsCategory.Border