如何增加标签中的转换值?

时间:2015-02-12 15:35:53

标签: ios swift sprite-kit

我正在开发一个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)

不会更新。有办法解决这个问题吗?

3 个答案:

答案 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)

scoreLabelTextscore是两个不同的变量。每次更新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)" } }