我正在尝试更新我的“剩余生命:” 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)"