我正在尝试运行一个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
    }
}

希望能有所帮助。

10-07 22:04