为什么SKLabelNode在联系上增加太多? (迅速)

时间:2015-06-03 19:21:01

标签: swift physics bitmask

我试图让我的Label在每次精灵与Contact节点接触时增加+1,但它会增加大数,如+23。我认为正在发生的事情是它考虑到精灵正在接触节点的每一毫秒,但我不知道如何解决它。 这是我在DidMoveToView中的Label节点代码:

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()
            }
        }

'移动'就是当我的小行星精灵移动时,接触节点随之移动

1 个答案:

答案 0 :(得分:0)

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

您可以做的一件事是将SKNode子类化为实际的ContactNode类,该类具有最初设置为hasBeenStruck的属性false或该范围内的某些内容。< / p>

然后,当您检查联系人时,首先检查hasBeenStruck是否为假。如果是,请注册匹配并更新分数,然后将ContactNode的{​​{1}}属性设置为hasBeenStruck。这样,在接下来的20个左右的检查中,看看是否发生了联系,它不会继续更新标签,因为if条件已经失败。

但是,如果您的游戏允许用户同时点击true两次并获得两次得分,则这不是一个完整的解决方案。如果是这种情况,你可以使用计时器或&#34;无敌&#34;给定ContactNode的期间。