SpriteKit如何处理多次碰撞检测

时间:2017-12-23 21:17:36

标签: swift sprite-kit collision-detection swift4

我正在努力创造一个脆弱的鸟类克隆。我为地面,鸟类和两个管道创造了物理实体。

我想让鸟不要穿过地面,但能够通过管道。我使用以下代码来实现此目的。

// 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?.collisionBitMaskpipe2.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

0 个答案:

没有答案