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

Posted

技术标签:

【中文标题】斯威夫特:分数增加两次,因为碰撞被检测到两次?【英文标题】:Swift: score increases twice because collision is detected twice? 【发布时间】:2015-06-15 05:48:11 【问题描述】:

我正在快速构建一个精灵套件游戏,当检测到 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 语句中的分数不会增加,因为它不会在我的游戏中发生。

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

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

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

分数上升了 2 而不是 1,因为 savior 似乎从 chicken1 “反弹”,因此 contact.bodyA.categoryBitMask 设置为等于 ColliderType.Savior.rawValue TWICE 每次似乎发生一次碰撞。

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

【问题讨论】:

只是好奇,为什么你不能一直将分数除以 2?这会导致以后出现错误吗? @iamdavidlam :您不能确定是否会持续发生两次碰撞。解决问题比解决问题要好。 @skyguy:您能否向我们展示您的类别位掩码的声明以及您如何将它们分配给您的节点?如果它们设置正确,您可能希望在主节点上使用(我猜是“救世主”):theSaviorNode.physicsBody.usesPreciseCollisionDetection = YES. @iamdavidlam lchamp 是对的;只有有时会检测到两次碰撞。其他时候精灵节点只是互相擦擦。如果您对答案感到好奇,我在下面找到了答案- 【参考方案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!")

            

【讨论】:

以上是关于斯威夫特:分数增加两次,因为碰撞被检测到两次?的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特:我必须调用 Facebook 登录按钮两次才能获得 FBSDKAccessToken

Yolo V4 两次检测到一个物体

didReceiveRemoteNotification函数调用两次

两次GroupBy 的SQL语句如何写

如何检测两次输入的密码是不是一致?

Java 技术篇 - 前端浏览器发送一次url请求后端ServerSocket接收到两次请求原因及解决方法,GET /favicon.ico HTTP/1.1问题处理