斯威夫特:分数增加两倍,因为被检测到两次碰撞?(Swift: score increases twi

2019-10-23 09:02发布

我在建设迅速精灵套件的比赛,我需要的分数被检测到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)

        }

if语句,因为它不能在我的比赛成绩发生没有在别的提高。

的问题是, animalsCount 2,而不是1的增加,每次saviorchicken1碰撞。

一些故障排除后,我发现这并不是因为比分被增加为两个碰撞体。 这种情况并非如此,因为只有1行代码是从来也不会满意。 这是一种满意的唯一行:

if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue)

比分上升了2,而不是1,因为savior ,似乎“反弹”关闭的chicken1使contact.bodyA.categoryBitMask设置等于ColliderType.Savior.rawValue两次,每次碰撞似乎出现一次。

我不知道如何解决这个问题。 如何让这个碰撞只有一次检测的,因此得分只有一次增加了吗?

Answer 1:

我终于解决了使用控制的if语句这样的碰撞只能一次,直到精灵节点通过循环和变量被重置检测到一个int变量的问题。

我声明一个变量叫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!")

            }}


文章来源: Swift: score increases twice because collision is detected twice?