好吧首先,我有一个成就变量,它是从结构中定义的:
struct Achieve {
var node: SKSpriteNode?
var aName:String = ""
var aDes:String = ""
var aImage: String = "" {
didSet {
node?.texture = SKTexture(imageNamed: aImage)
}
}
var aAmount:Int = 0
var aRequired:Int = 0
var aStage:Int = 0
}
var Ach1 = Achieve(node: nil, aName: "Player", aDes: "Games Played", aImage: "locked", aAmount: 0, aRequired: 10, aStage: 1)
我的问题是,当我尝试更改aAmount属性的数量时,它没有显示在SKLabel上,显示它刚好保持在0的量我的sklabel是在如下函数中定义的:
func generateLabels(location: CGPoint, page:SKSpriteNode, text: String) -> SKLabelNode {
let node = SKLabelNode()
node.fontColor = UIColor.whiteColor()
node.fontName = "Helvetica"
node.position = location
node.fontSize = 15
node.text = text
page.addChild(node)
return node
}
func menu() {
_ = generateLabels(CGPointMake(0, -285), page:page1ScrollView, text: "\(Ach1.aAmount) / \(Ach1.aRequired)")
}
如果我在停止运行aAmount时对其进行更改然后更改它然后再次运行游戏,那么它似乎有效。它似乎也在游戏过程中对aAmount属性进行了更改,但在游戏过程中似乎没有因某种原因更新标签。有人可以告诉我为什么它不会更新?
另外我更新了aAmount属性,如下所示:
Ach1.aAmount += 1
print("\(Ach1.Amount)")
答案 0 :(得分:3)
如果我阅读了您的代码,则没有任何部分可以更新SKLabelNode
。
如果您致电该功能:
func menu() {
_ = generateLabels(CGPointMake(0, -285), page:page1ScrollView, text: "\(Ach1.aAmount) / \(Ach1.aRequired)")
}
例如didMoveToView
,当您调用场景时,它会生成一个带有aAmount
值的标签(因此只有didMoveToView
工作时才会生成一次)。
相反,假设您多次调用此menu
函数,它会在每次生成新标签时生成,但是您没有从中删除过去添加的上一个标签或标签的代码(请参阅{{1}如果你不使用它,我不明白你为什么要从你的函数返回一个标签,实际上你将结果赋给_。你也不解释什么是“page.addChild(node)
”,你使用的是滚动视图吗?
无论如何,更新标签的最佳模式只是创建一次(例如在page1ScrollView
上),并且每当您想要更新它时,执行:
didMoveToView
而不是每次都重新创建它。我希望这有助于理解阻止标签升级的动态。
答案 1 :(得分:3)
在Achieve
结构中,添加名为label
的属性:
var label: SKLabelNode?
并将aAmount
属性更改为如下所示:
var aAmount: Int = 0 {
didSet {
label?.text = "\(aAmount) / \(aRequired)"
}
}
现在,当您生成标签时,请将其替换为:
_ = generateLabels(CGPointMake(0, -285), page:page1ScrollView,
text: "\(Ach1.aAmount) / \(Ach1.aRequired)")
用这个
var label = _ = generateLabels(CGPointMake(0, -285), page:page1ScrollView,
text: "\(Ach1.aAmount) / \(Ach1.aRequired)")
Ach1.label = label
现在,当您更改aAmount
的{{1}}属性时,标签的文字也会发生变化。
建议:
从此以及关于精灵节点图像未更新的最后一个问题来判断,我认为您的编程技巧还不够成熟。从长远来看,您应该首先学习基础知识。尝试使用Ach1
并阅读更多其他人的代码。了解其他人如何做事。你肯定会学到很多东西。但是,在短期内,您不应该使所有这些属性都绑定到节点。这将使UIKit
过于依赖。您应该做的是使Achieve
成为Achieve
的子类,并将其他精灵节点和标签节点添加为SKSpriteNode
节点的子节点。
答案 2 :(得分:1)
您必须重新分配SKLabel的文本。因此,当您调用函数来更改数字(或其他任何内容)时,还要运行代码以使标签成为您想要的标签。我猜测它为什么只能工作有时是因为你有时会在更新中调用它(或者在其他地方被反复调用),有时你会在某个地方调用它,比如didMoveToView(只调用一次,因此标签不会更新,因为您的代码的方式)。
每当您更新aAmount
时,请在其后添加以下代码:
label.text = "\(aAmount)"