我正在尝试更新我的“剩余生命:” UILabel,但是我无法根据类或实例的当前变量值(在本例中为lives)对其进行更新。我在以下代码中使用didSet这样做:

Ship类:

class Ship:SKSpriteNode{

    ...

    var lives:Int = 0{
        didSet{
            shipLivesLabel?.text = self.lives.description

        }
    }


实例化GameScene中的标签:

class GameScene: SKScene, SKPhysicsContactDelegate {

    private var shipLives = 0 {
        didSet{
            self.shipLivesLabel?.text = aShip.lives.description
        }
    }
    private var shipLivesLabel:SKLabelNode?


以及将其添加到场景中的位置:

override func didMoveToView(view: SKView) {

    let shipLivesLabel = SKLabelNode(fontNamed: "Times New Roman")
    shipLivesLabel.text = shipLives.description
    shipLivesLabel.fontSize = 14
    shipLivesLabel.position = CGPoint(x:CGRectGetMidX(self.frame)*1.3,y:CGRectGetMidY(self.frame)*0.1)
    self.addChild(shipLivesLabel)
    self.shipLivesLabel = shipLivesLabel


我不确定这是否是解决此问题的正确方法,也不确定如何在shipLivesLabel类中引用Ship-我收到错误:Instance member shipLivesLabel cannot be used on type GameScene。任何帮助都是极好的。

最佳答案

您的问题在:

private var shipLives = 0 {
        didSet{
            self.shipLivesLabel?.text = aShip.lives.description
        }
}


您的self.shipLivesLabel在此分配期间可能未准备好的地方。

所以发生了什么事?

您尝试将一个未赋值的类的值分配给他的属性。

错误的语法:

MyClass.variable = 'Foo'
// error:  Instance member 'variable' cannot be used on type 'MyClass'


好的语法:

instanceOfMyClass.variable = 'Foo'


关于您的情况:

GameScene.shipLivesLabel完全初始化之前使用的GameScene分配。

我不喜欢您编写重要游戏属性(例如角色的生命计数器)的方法。请看一下这个答案,以更好地理解我的意思:answer



Tibrogargan在有问题的评论中给出的另一条建议是不要使用描述:这是一种不好的态度,它用于调试,live是Int,如果您想将其分配给String,请执行以下操作:

shipLivesLabel.text = "\(shipLives)"

09-27 04:25