为什么 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 SKNode
子 ContactNode
class 转换为具有 属性 hasBeenStruck
的实际 ContactNode
class最初设置为 false
或某种程度的东西。
然后当你检查联系人时,你首先检查hasBeenStruck
是否为假。如果是,则注册命中并更新分数,然后将 ContactNode
的 hasBeenStruck
属性 设置为 true
。这样,在接下来的 20 次左右检查是否发生接触时,它不会因为 if 条件失败而继续更新标签。
但是,如果您的游戏允许用户两次击中相同的 ContactNode
并且两次都得分,那么这不是一个完整的解决方案。如果是这种情况,您可以为给定的 ContactNode
.
使用计时器或 "invincibility" 周期
我试图让我的 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 SKNode
子 ContactNode
class 转换为具有 属性 hasBeenStruck
的实际 ContactNode
class最初设置为 false
或某种程度的东西。
然后当你检查联系人时,你首先检查hasBeenStruck
是否为假。如果是,则注册命中并更新分数,然后将 ContactNode
的 hasBeenStruck
属性 设置为 true
。这样,在接下来的 20 次左右检查是否发生接触时,它不会因为 if 条件失败而继续更新标签。
但是,如果您的游戏允许用户两次击中相同的 ContactNode
并且两次都得分,那么这不是一个完整的解决方案。如果是这种情况,您可以为给定的 ContactNode
.