我正在努力创造一个脆弱的鸟类克隆。我为地面,鸟类和两个管道创造了物理实体。
我想让鸟不要穿过地面,但能够通过管道。我使用以下代码来实现此目的。
// Collisions
// Bird
bird.physicsBody?.categoryBitMask = birdCategory
bird.physicsBody?.collisionBitMask = groundCategory
bird.physicsBody?.contactTestBitMask = groundCategory | pipeCategory
// Ground
ground.physicsBody?.categoryBitMask = groundCategory
ground.physicsBody?.collisionBitMask = birdCategory
// Pipes
pipe1.physicsBody?.categoryBitMask = pipeCategory
pipe1.physicsBody?.collisionBitMask = 0
pipe2.physicsBody?.categoryBitMask = pipeCategory
pipe2.physicsBody?.collisionBitMask = 0
问题是,即使我将pipe1.physicsBody?.collisionBitMask
和pipe2.physicsBody?.collisionBitMask
设置为等于0,鸟也会与管道和地面相互作用。
我根据Apple的文档搜索了一下:
当两个物理实体相互接触时,可能会发生碰撞。通过执行逻辑AND运算,将该物体的碰撞掩模与其他物体的类别掩码进行比较。如果结果为非零值,则此实体会受到碰撞的影响。
我不太清楚为什么这只鸟明显不应该穿过烟斗。
EDIT1
我在代码的第一部分中定义了类别位掩码,如下所示:
let birdCategory : UInt32 = 0x1 << 0
let groundCategory: UInt32 = 0x1 << 1
let pipeCategory: UInt32 = 0x1 << 2
EDIT2
这就是我为所有节点定义物理实体的方法:
鸟:
bird.physicsBody = SKPhysicsBody(circleOfRadius:birdTexture.size().height / 2)
bird.physicsBody!.isDynamic = false
// The bird is dynamic later on the touchesBgan function
接地:
ground.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width:self.frame.width, height: 1))
ground.physicsBody!.isDynamic = false
管(S)
pipe1.physicsBody = SKPhysicsBody(rectangleOf: pipe1Texture.size())
pipe1.physicsBody!.isDynamic = false