我试图让我的标签在每次精灵与接触节点接触时递增+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)

这是我的代码,当我的火箭精灵与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()
            }
        }

“移动”是当我的小行星精灵移动时,接触节点也随之移动

最佳答案

可能不是每毫秒,而是每一帧,这就是为什么你可能会得到+23这样的数字(碰撞发生的时间是1/3秒,如果它以60 FPS的速度运行,大约是20帧左右)。
您可以做的一件事是将SKNode子类转换成一个实际的ContactNode类,该类的属性hasBeenStruck最初设置为false或某种程度的属性。
然后在检查contact时,首先检查hasBeenStruck是否为false。如果是,注册命中并更新分数,然后将ContactNodehasBeenStruck属性设置为true。这样,在接下来的20个左右检查是否发生了联系时,它不会继续更新标签,因为if条件已失败。
但是,如果你的游戏允许用户点击同一个ContactNode两次并同时获得分数,这不是一个完整的解决方案。如果是这样的话,你可以在给定的ContactNode中使用定时器或“无敌”时间段。

07-27 13:40