SKPhysicsBody 避免碰撞 Swift/SpriteKit
SKPhysicsBody avoid collision Swift/SpriteKit
我的场景中有 3 个 SKSpriteNode。一只 bird,一只 coin 和一个 border 围绕场景。我不希望 coin 和 bird 与 border 相互碰撞。
我为每个节点分配了不同的 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……等等。
编辑:
此外,您可能希望使用结构而不是枚举,并使用另一种语法使其更容易(这不是强制性的,只是偏好问题):
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
我的场景中有 3 个 SKSpriteNode。一只 bird,一只 coin 和一个 border 围绕场景。我不希望 coin 和 bird 与 border 相互碰撞。 我为每个节点分配了不同的 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……等等。
编辑:
此外,您可能希望使用结构而不是枚举,并使用另一种语法使其更容易(这不是强制性的,只是偏好问题):
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