SKPhysicsBody避免碰撞Swift / SpriteKit
我的场景中有3个SKSpriteNodes。现场有 ,一枚 和一个 。我不想 和
互相碰撞,而是与 碰撞。我为每个节点分配了一个不同的collisionBitMask和categoryBitMask:
enum CollisionType:UInt32{ case Bird = 1
case Coin = 2
case Border = 3
}
像这样:
bird.physicsBody!.categoryBitMask = CollisionType.Bird.rawValuebird.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
}
请记住,下一个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.Birdbird.physicsBody!.collisionBitMask = PhysicsCategory.Border
coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
coin.physicsBody!.collisionBitMask = PhysicsCategory.Border
以上是 SKPhysicsBody避免碰撞Swift / SpriteKit 的全部内容, 来源链接: utcz.com/qa/404551.html