我试图让我的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()
}
}
'移动'就是当我的小行星精灵移动时,接触节点随之移动
答案 0 :(得分:0)
它可能不是每一毫秒,而是每一帧,这就是为什么你可能最终得到像+23这样的数字(碰撞发生在1/3秒内,如果它以60 FPS的速度运行,约为20帧左右。
您可以做的一件事是将SKNode
子类化为实际的ContactNode
类,该类具有最初设置为hasBeenStruck
的属性false
或该范围内的某些内容。< / p>
然后,当您检查联系人时,首先检查hasBeenStruck
是否为假。如果是,请注册匹配并更新分数,然后将ContactNode
的{{1}}属性设置为hasBeenStruck
。这样,在接下来的20个左右的检查中,看看是否发生了联系,它不会继续更新标签,因为if条件已经失败。
但是,如果您的游戏允许用户同时点击true
两次并获得两次得分,则这不是一个完整的解决方案。如果是这种情况,你可以使用计时器或&#34;无敌&#34;给定ContactNode
的期间。