如何增加标签中的转换值?
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 设置中定义它,您将获得最新的分数。
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)" } }
您更改了分数,但没有更改 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 = ....
,直接定位,添加到视图中即可。
我正在开发一个 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 设置中定义它,您将获得最新的分数。
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)" } }
您更改了分数,但没有更改 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 = ....
,直接定位,添加到视图中即可。