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

How to increment converted value in a label?

我正在开发一个 spriteKit 游戏,我想要一个 SKLabelNode 来显示分数。分数是一个整数,所以我走到这一步:

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 初始化 scoreLabelText,但从未更改它。 scoreLabelText 不需要是全局变量,因为它只存在于填充您的 scoreLabel,因此在您的 scoreLabel 设置中定义它,您将获得最新的分数。

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

您更改了分数,但没有更改 scoreLabelText。如果您始终希望 scoreLabelText 与分数的当前字符串值相匹配,您可以尝试使用 属性 观察器。

var scoreLabelText = "\(0)"
var score:Int = 0 { didSet { scoreLabelText = "\(score)" } }

现在任何时候得分改变,它也应该改变 scoreLabelText。

为什么不为 scoreLabelText 设置 属性,为什么不将 scoreLabel 设置为 属性 以便您可以访问它。

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 = ....,直接定位,添加到视图中即可。