我正在尝试运行一个if语句来更改SpriteKit中的文本标签的颜色,其中生命数已达到某个数字。但颜色并没有从白色变成红色。
在我的游戏中,小行星每经过一次宇宙飞船,生命就会减少1。
现在文本标签代码如下所示:
livesLabel.text = "Lives: 3"
livesLabel.fontSize = 70
if livesNumber == 1 {
livesLabel.fontColor = SKColor.red
} else {
livesLabel.fontColor = SKColor.white
}
livesLabel.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.right
if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 2436: // Checks if device is iPhone X
livesLabel.position = CGPoint(x: self.size.width * 0.79, y: self.size.height * 0.92)
default: // All other iOS devices
livesLabel.position = CGPoint(x: self.size.width * 0.85, y: self.size.height * 0.95)
}
}
livesLabel.zPosition = 100
self.addChild(livesLabel)
我有一个函数,其中livesNumber if语句工作正常,如下所示:
func loseALife() {
livesNumber -= 1
livesLabel.text = "Lives: \(livesNumber)"
let scaleUp = SKAction.scale(to: 1.5, duration: 0.2)
let scaleDown = SKAction.scale(to: 1, duration: 0.2)
let scaleSequence = SKAction.sequence([scaleUp, scaleDown])
livesLabel.run(scaleSequence)
if livesNumber == 0{
runGameOver()
}
}
如果有人能解释一下,那就太好了。我以为这可能与String或Int有关,但由于这适用于其他函数,而且我尝试了一些String-to-Int转换,但它什么也没有改变,我不再确定问题是什么。
最佳答案
从上面的讨论可以看出,问题是“颜色标签”代码在视图初始化时运行了一次。因此,当随后更新livesNumber
值时,不会执行“颜色标签”代码。
这可以用几种方法来解决。一种是将其添加到looeALife
函数中:
func loseALife() {
livesNumber -= 1
livesLabel.text = "Lives: \(livesNumber)"
if livesNumber == 1 {
livesLabel.fontColor = SKColor.red
} else {
livesLabel.fontColor = SKColor.white
}
let scaleUp = SKAction.scale(to: 1.5, duration: 0.2)
let scaleDown = SKAction.scale(to: 1, duration: 0.2)
let scaleSequence = SKAction.sequence([scaleUp, scaleDown])
livesLabel.run(scaleSequence)
if livesNumber == 0{
runGameOver()
}
}
(可能将其提取到单独的函数中)
您还可以将
didSet
添加到livesNumber
中,然后更新其中的值:var livesNumber: Int = 3 {
didSet {
livesLabel.color = livesNumber == 1 ? .red : .white
}
}
希望能有所帮助。