Swift Spritekit碰撞处理

时间:2016-04-13 01:42:30

标签: swift sprite-kit collision

这是我第一次尝试使用SpriteKit而我遇到了使用bitmasks进行碰撞时遇到的问题。 我有三个类别,如果玩家点亮,我想增加分数并将点亮的节点移出屏幕,否则,我想调用我的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()
    }

}

1 个答案:

答案 0 :(得分:0)

if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)用英语翻译成以下内容。

如果Firstbody AND playerCategory = 0 AND SecondBody且litCategory = 1

如果Firstbody AND 1 = 0 AND SecondBody且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 AND litCategory)只能具有0或4的值,那么这2个值将永远不会为1。

要纠正此问题,您需要确保您检查的任何正文与您要查找的类别相同

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()
    }

}