Swift Spritekit 碰撞处理

Swift Spritekit Collision Handling

这是我第一次尝试使用 SpriteKit,但我无法正确处理位掩码的碰撞。 我有三个类别,如果玩家点亮,我想增加分数并将点亮的节点移出屏幕,否则,我想调用我的 gameover() 函数。我已经尝试了很多变体,但除了一般碰撞之外什么都看不到。我也为每个节点定义了类别和联系位掩码。

let playerCategory: UInt32 = 1
let razzCategory: UInt32 = 2
let litCategory: UInt32 = 4

 func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA
        secondBody = contact.bodyB

    }

    else
    {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)
    {
        lit.position.x = 400
        score += 1
    }
    else {
        gameOver()
    }

}

if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1) 翻译成英文如下。

If Firstbody AND playerCategory = 0 AND SecondBody And litCategory = 1

If Firstbody AND 1 = 0 AND SecondBody And 4 = 1

现在让我们将 Firstbody 定义为 playerCategory,将 SecondBody 定义为 litCategory

如果 playerCategory AND playerCategory = 0 AND litCategory 和 litCategory = 1

如果 1 AND 1 = 0 AND 4 AND 4 = 1

如果 1 = 0 且 4 = 1

如您所见,这失败了,而且这种方法总是会失败,因为如果测试的后半部分(SecondBody 和 litCategory)只能有 0 或 4 的值,那么这 2 个值将永远不会1.

要更正此问题,您需要确保您正在检查的 body 与您正在查找的类别相同

if ((firstBody.categoryBitMask & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory)

这里说的是如果firstBody是类别playerCategory的成员,secondBody是litCategory的成员,那么执行下面的操作。

以下是您的功能的完整修复:

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA
        secondBody = contact.bodyB

    }

    else
    {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if ((firstBody.categoryBitMask & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory)
    {
        lit.position.x = 400
        score += 1
    }
    else {
        gameOver()
    }

}