斯威夫特:得分增加两倍,因为碰撞被检测到两次?

时间:2015-06-15 05:48:12

标签: swift sprite-kit collision-detection

我正在swift中构建一个sprite kit游戏,当检测到2个节点之间的冲突时,我需要将得分增加1。分数存储在名为animalsCount的变量中,并输出到标签节点:

    //Score count in stats bar
    //Animal score count

    animalsCount = 0

    animalsCountLabel.text = "\(animalsCount)"
    animalsCountLabel.fontSize = 45
    animalsCountLabel.fontColor = SKColor.blackColor()
    animalsCountLabel.position = CGPoint (x: 630, y: 40)

    addChild(animalsCountLabel)

碰撞的两个精灵节点是saviorchicken1。现在,我使用以下代码保持得分并检测碰撞:

 func didBeginContact(contact: SKPhysicsContact) {

        //Chicken1

        if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue )  {

            println("chicken1 contact made")
            chicken1.hidden = true
            chicken1.setScale(0)

            animalsCount++
            animalsCountLabel.text = "\(animalsCount)"


        } else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue)  {

            println("chicken1 contact made")
            chicken1.hidden = true
            chicken1.setScale(0)

        }

else if语句中的分数没有增加,因为它不会发生在我的游戏中。

问题在于animalsCount每次saviorchicken1发生碰撞时if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue) 增加2而不是1。

经过一些故障排除后,我发现这不是因为两个碰撞体的分数都在增加。情况并非如此,因为只满足一行代码。这是唯一满足的一条线:

savior

得分上升2而不是1,因为chicken1似乎"反弹"关闭contact.bodyA.categoryBitMask,以便每次碰撞发生时,ColliderType.Savior.rawValue等于strtr TWICE。

我不知道如何解决这个问题。如何才能使碰撞仅在ONCE中检测到,因此分数只会增加一次?

1 个答案:

答案 0 :(得分:2)

我最终使用Int变量解决了问题,该变量控制if语句,因此只能检测到一次碰撞,直到sprite节点循环并且变量被重置。

我声明了一个名为chickenHasBeenGrabbed的变量,并将其初始设置为0。一旦第一次检测到碰撞,我将chickenHasBeenGrabbed设置为1.只有在chickenHasBeenGrabbed设置回0后才能再次检测到碰撞:

func didBeginContact(contact: SKPhysicsContact) {

        //Chicken1

        if chickenHasBeenGrabbed == 0  {

        if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue )  {

            println("chicken1 contact made")
            chicken1.hidden = true
            chicken1.setScale(0)

            animalsCount += 1
            animalsCountLabel.text = "\(animalsCount)"

            chickenHasBeenGrabbed = 1


        } else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue)  {

            println("chicken1 contact made")
            chicken1.hidden = true
            chicken1.setScale(0)

        }
        }

        else if chickenHasBeenGrabbed == 1 {

            if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue )  {

                println("nothing to do; chicken was already grabbed!")


            } else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue)  {

                println("nothing to do; chicken was already grabbed!")

            }}