为什么 SKLabelNode 在 Contact 上增加太多? (Swift)

Why does SKLabelNode increment too much on Contact? (Swift)

我试图让我的 Label 在每次精灵与 Contact 节点接触时递增 +1,但它递增了很大的数字,例如 +23。我认为正在发生的事情是它考虑了精灵接触节点的每一毫秒,但我不知道如何修复它。 这是我在 DidMoveToView 中的标签节点代码:

score = 0
        scoreLabelNode = SKLabelNode(fontNamed:"[z] Arista Light")
        scoreLabelNode.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/4)
        scoreLabelNode.zPosition = 100
        scoreLabelNode.fontSize = 500
        scoreLabelNode.alpha = 0.03
        scoreLabelNode.text = String(score)
        self.addChild(scoreLabelNode)

这是我的联系节点:

var contactNode = SKNode()
        contactNode.position = CGPoint(x: self.frame.size.width + asteroidTexture.size().height / 15 + rocket.size.width, y: 0.0)
        contactNode.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake( asteroid.size.width/16, self.frame.size.height*2 ))
        contactNode.physicsBody?.dynamic = false
        contactNode.physicsBody?.categoryBitMask = scoreCategory
        contactNode.physicsBody?.contactTestBitMask = rocketCategory
        contactNode.runAction(asteroidsMoveAndRemove)
        moving.addChild(contactNode)

这是我的代码,当我的火箭精灵与接触节点接触时,它会递增:

func didBeginContact(contact: SKPhysicsContact) {

        if moving.speed > 0 {
            if ( contact.bodyA.categoryBitMask & scoreCategory ) == scoreCategory || ( contact.bodyB.categoryBitMask & scoreCategory ) == scoreCategory {
                // Rocket has contact with score entity
                score++
                scoreLabelNode.text = String(score)
                println("HIT")
            }
            else{
                gameOver()
            }
        }

'moving'是我的小行星精灵移动的时候,接触节点也随之移动

可能不是每一毫秒,而是每一帧,这就是为什么你可能会得到像 +23 这样的数字(碰撞发生了 1/3 秒,如果它是 运行在 60 FPS 下大约是 20 帧左右)。

您可以做的一件事是将 class SKNodeContactNode class 转换为具有 属性 hasBeenStruck 的实际 ContactNode class最初设置为 false 或某种程度的东西。

然后当你检查联系人时,你首先检查hasBeenStruck是否为假。如果是,则注册命中并更新分数,然后将 ContactNodehasBeenStruck 属性 设置为 true。这样,在接下来的 20 次左右检查是否发生接触时,它不会因为 if 条件失败而继续更新标签。

但是,如果您的游戏允许用户两次击中相同的 ContactNode 并且两次都得分,那么这不是一个完整的解决方案。如果是这种情况,您可以为给定的 ContactNode.

使用计时器或 "invincibility" 周期