更新 SKLabel 以显示正确的整数

updating an SKLabel to show the right integer

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

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

您必须重新分配 SKLabel 的文本。因此,当您调用该函数来更改数字(或任何数字)时,还有 运行 代码来使标签成为您想要的样子。我猜测为什么它有时只起作用是因为有时你在更新中调用它(或在其他地方重复调用)有时你在 didMoveToView 之类的地方调用它(只调用一次,所以标签不会因为你的代码是这样的)。

每当您更新 aAmount 时,在其后添加此代码:

label.text = "\(aAmount)"

如果我阅读了您的代码,则没有您更新 SKLabelNode 的任何部分。

如果调用函数:

func menu() {
   _ = generateLabels(CGPointMake(0, -285), page:page1ScrollView, text: "\(Ach1.aAmount) / \(Ach1.aRequired)") 
}

例如 didMoveToView,它会在您调用场景时生成一个带有您的 aAmount 值的标签(因此 didMoveToView 仅工作 1 次)。

相反,假设您多次调用此 menu 函数,它每次都会生成一个新标签,但是您没有编写代码来删除以前添加的标签(请参阅 page.addChild(node)) 而且我不明白为什么要 return 如果您不使用函数中的标签,实际上您将结果分配给 _。你也不解释什么是“page1ScrollView”,你用的是scrollview吗?

无论如何,更新标签的最佳方式是仅创建 1 次(例如在 didMoveToView 上),并且每次要更新标签时,请执行以下操作:

myNodeLabel.text = "\(Ach1.aAmount) / \(Ach1.aRequired)"

而不是每次都重新创建它。我希望这有助于了解阻止您的标签升级的动态。

在您的 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

现在,当您更改 Ach1aAmount 属性 时,标签的文本也应更改。

建议:

从这个和你上一个精灵节点图片不更新的问题来看,我认为你的编程技术还不够成熟。从长远来看,您应该先学习基础知识。尝试使用 UIKit 并阅读更多其他人的代码。看看其他人是如何做事的。你一定会学到很多东西。不过在短期内,您不应该将所有这些属性中的每一个都绑定到一个节点。这会使 Achieve 过于依赖。你应该做的是使 Achieve 成为 SKSpriteNode 的子类,并将其他精灵节点和标签节点添加为 Achieve 节点的子节点。