一尘不染

SKPhysicsBody避免碰撞Swift / SpriteKit

swift

我的场景中有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

但是 硬币 仍然相互碰撞。我究竟做错了什么?


阅读 392

收藏
2020-07-07

共1个答案

一尘不染

位掩码为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
}

请记住,下一个bitmask必须遵循相同的步骤:8,16,…依此类推。

编辑:

另外,您可能想使用结构而不是枚举,并使用另一种语法来简化操作(这不是强制性的,只是出于优先考虑):

struct PhysicsCategory {
    static let None       : UInt32 = 0
    static let All        : UInt32 = UInt32.max
    static let Bird       : UInt32 = 0b1       // 1
    static let Coin       : UInt32 = 0b10      // 2
    static let Border     : UInt32 = 0b100     // 4
}

您可以这样使用:

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

coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
coin.physicsBody!.collisionBitMask = PhysicsCategory.Border
2020-07-07