【问题标题】:Updating SKLabel text through an SKNode subclass通过 SKNode 子类更新 SKLabel 文本
【发布时间】:2016-12-07 13:00:15
【问题描述】:

我的目标:在成就类的数量变量上加一,然后更新文本,使其显示在名为“AmountLabel”的 SKLabelNode 上

所以我有一个 SKNode 的子类,它隐藏了我的 SKSpriteNode,它显示了成就的标志和成就标题的 SKLabelNodes 以及解锁成就所需的数量如下所示:

class Achievements: SKNode {

var achievementLabel = SKLabelNode()
var achievementTitleLabel = SKLabelNode()
var achievementNode = SKSpriteNode()

var amount = 0
var neededAmount = 0

var Image: String = "locked" {
    didSet {
       var texture = SKTexture(imageNamed: Image)
    }
}

func createAchievement() {

    let tex:SKTexture = SKTexture(imageNamed: Image)

    achievementNode = SKSpriteNode(texture: tex, color: SKColor.black, size: CGSize(width: 75, height: 75))  //frame.maxX / 20, height: frame.maxY / 20))
    achievementNode.zPosition = -10
    achievementNode.name = "AchievementNode"

    amount = 0
    neededAmount = 10

    self.addChild(achievementNode)
    self.zPosition = -11
    Achievements3.append(achievementNode)

    createAchievementLabels()
}

func createAchievementLabels() {

    achievementTitleLabel = SKLabelNode(fontNamed: "Avenir-Black")
    achievementTitleLabel.fontColor = UIColor.black;
    achievementTitleLabel.fontSize = 13 //self.frame.maxY/30
    achievementTitleLabel.position = CGPoint (x: 0, y: 45)
    achievementTitleLabel.text = "COLLECTOR"
    achievementTitleLabel.zPosition = -9
    addChild(achievementTitleLabel)

    achievementTitleLabel.name = "AchievementTitleLabel"

    achievementLabel = SKLabelNode(fontNamed: "Avenir-Black")
    achievementLabel.fontColor = UIColor.black;
    achievementLabel.fontSize = 13 //self.frame.maxY/30
    achievementLabel.position = CGPoint (x: 0, y: -50)
    achievementLabel.text = ("\(amount) / \(neededAmount)")
    achievementLabel.zPosition = -9
    addChild(achievementLabel)

    achievementLabel.name = "AmountLabel"
    AchievementLabels.append(achievementLabel)

}

func UpdateText() {

    achievementLabel.text = ("\(amount) / \(neededAmount)")

   }

}

然后将它们添加到另一个名为AchievementMenu 的类中,如下所示:

for 0...12 {

     let Achievement = Achievements()
     Achievement.createAchievement()
     Achievement.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
     Achievement.zPosition = 100
     moveableArea.addChild(Achievement)
}

然后在AchievementMenu 类的另一个函数中,我尝试通过节点树进行枚举,以便能够更新标签以将其添加到其数量变量,然后像这样更新其文本:

 func addOneToAchievementAndUpdateText() {

    moveableArea.enumerateChildNodes(withName: "SKNode") {
        node, stop in

        let LabelAmount:Achievements = node as! Achievements

        node.enumerateChildNodes(withName: "AmountLabel") {
            node, stop in

            LabelAmount.amount += 1
            LabelAmount.UpdateText()

        }
    }
}

但是每次我尝试将一个变量转换为一个实际的类时,它都会给我一个错误:

无法将“SKLabelNode”(0x10e5edb08) 类型的值转换为 'Astrum.Achievements' (0x10c899438)。

如何将金额变量加一,然后更新文本以在屏幕上显示新金额?

【问题讨论】:

    标签: swift sprite-kit sknode sklabelnode


    【解决方案1】:

    为避免转换错误,您可以将节点类型检查为:

    func addOneToAchievementAndUpdateText() {
    
        moveableArea.enumerateChildNodes(withName: "SKNode") {
            node, stop in
            print("- node type is: \(type(of: node))")
            if node is Achievements {
                let achievements = node as! Achievements
                achievements.amount += 1
                achievements.UpdateText()
            }
        }
    }
    

    如果你在该行后面加上,你的错误就不会出现:

    Achievement.zPosition = 100
    

    这一行:

    Achievement.name = "SKNode"
    

    P.S.不要忘记对变量使用小写字母,以免将它们与类类型混淆:通常这被认为是一种不好的态度..

    【讨论】:

    • 在增加数量变量和更新文本方面,这会达到我想要的吗?
    • 在你获得成就的那一刻,你也可以启动results.UpdateText()并获取amount var
    • 所以我只是在 let 语句之后和作为类的转换之后访问它?
    • 感谢您的帮助 Alessandro 我还有一个关于保存成就的问题,如果您不介意在这里为我看一下,如果不再次感谢您的帮助。 stackoverflow.com/questions/41038237/…
    猜你喜欢
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2011-11-03
    • 2021-02-25
    • 2013-07-30
    相关资源
    最近更新 更多