更新SKLabel以显示正确的整数

时间:2016-08-27 00:39:29

标签: swift sprite-kit sklabelnode

好吧首先,我有一个成就变量,它是从结构中定义的:

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)")

3 个答案:

答案 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)"