我正在开发一个spriteKit游戏,我想要一个SKLabelNode来显示分数。得分是一个Int所以我得到了这个:
var score = 0
var scoreLabelText = "\(score)"
我把它放在GameScne之外,因为如果我在里面做它就告诉我Gamescene没有一个名为score的成员。
在didBeginContact
函数中我得到了这个:
if firstBody.categoryBitMask == DropCategory && secondBody.categoryBitMask == GroundCategory {
println(score)
score++
我确实在控制台中看到了分数,但我的标签位于didMoveToView
let scoreLabel = SKLabelNode(text: scoreLabelText)
scoreLabel.position = CGPointMake(self.frame.width - self.frame.width/8, self.frame.height - self.frame.height/8)
addChild(scoreLabel)
不会更新。有办法解决这个问题吗?
答案 0 :(得分:1)
您可以更改分数,但不会更改scoreLabelText。如果您总是希望scoreLabelText匹配当前字符串的得分值,您可以尝试使用属性观察者。
var scoreLabelText = "\(0)"
var score:Int = 0 { didSet { scoreLabelText = "\(score)" } }
现在随时分数变化,它也应该改变scoreLabelText。
为什么不将scoreLabel设为属性以便您可以访问它,而不是拥有scoreLabelText的属性。
var scoreLabel: SKLabelNode?
var score:Int = 0 { didSet { scoreLabel!.text = "\(score)" } }
然后改变
let scoreLabel = SKLabelNode(text: scoreLabelText)
到
scoreLabel = SKLabelNode(text: "\(score)")
或者在定义中初始化scoreLabel属性,因此它不是可选的。
var scoreLabel = SKLabelNode(text: "\(0)")
var score:Int = 0 { didSet { scoreLabel.text = "\(score)" } }
然后你可以摆脱后来的scoreLabel = ....
并将其定位并将其添加到视图中。
答案 1 :(得分:0)
初始化scoreLabelText时,初始分数为0,但从不更改。 scoreLabelText不需要是全局变量,因为它只存在于您的scoreLabel中,因此在scoreLabel设置中定义它并获得最新的分数。
答案 2 :(得分:0)
scoreLabelText
和score
是两个不同的变量。每次更新score
时,您都需要更新scoreLabelText
,然后更新scoreLabel.text
if firstBody.categoryBitMask == DropCategory && secondBody.categoryBitMask == GroundCategory {
println(score)
score++
scoreLabelText = "\(score)"
}
// Then you need to update your scoreLabel
另一种解决方案是使用观察者在增加分数时自动更新标签:
let scoreLabel = SKLabelNode(text: "0")
scoreLabel.position = CGPointMake(self.frame.width - self.frame.width/8, self.frame.height - self.frame.height/8)
addChild(scoreLabel)
var score:Int = 0 { didSet { scoreLabel.text = "\(score)" } }