【问题标题】:updating an SKLabel to show the right integer更新 SKLabel 以显示正确的整数
【发布时间】:2016-08-27 00:39:29
【问题描述】:

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

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 上,而 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)")

【问题讨论】:

    标签: swift sprite-kit sklabelnode


    【解决方案1】:

    在您的 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 节点的子节点。

    【讨论】:

    • 您对var label = _ = generateLabels.. 的建议不要解决函数内部的page.addChild(node)。每次 OP 调用他的菜单函数时,页面中都会添加一个新标签,并且您将此新引用提供给全局变量。也就是说,在页面的同一个位置加上你的Ach1.label会有很多标签。
    • @AlessandroOrnano 你怎么知道 OP 会第二次调用menu
    • 出于同样的原因,您确信 OP 只会调用一次菜单,OP 问题中没有指定,特别是如果您调用具有复数名称的函数,例如“generateLabels”跨度>
    • 这很有效,谢谢。我目前仍在学习,对于我拥有的这个游戏项目的想法,我可能已经咬得比我能咀嚼的更多,但我仍然会坚持下去。至于您对所有内容进行子类化的建议,我不知道如何构建它。我有点理解类继承是如何工作的,但我总是对如何将它放在我的脑海里有一个问题,而且它似乎永远不会正确地转化为项目,因为总有一些我认为我可以做但真的做不到的事情因此我对此感到沮丧。再次感谢您的耐心和帮助。
    【解决方案2】:

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

    如果调用函数:

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

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

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

    无论如何,更新标签的最佳模式是只创建 1 次(例如在 didMoveToView),并且每次您想要更新它时,都这样做:

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

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

    【讨论】:

      【解决方案3】:

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

      只要你更新aAmount,在它后面添加这段代码:

      label.text = "\(aAmount)"
      

      【讨论】:

      • 那么如果在函数中定义了 SKlabel 的文本,我将如何重新分配它?因为我正在使用更新方法不断更改aAmount。一个代码示例会很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多