Обновление текста SKLabel через подкласс SKNode

Моя цель: добавить единицу в переменную количества класса достижений, а затем обновить текст, чтобы он отображался в SKLabelNode под названием "AmountLabel"

Итак, у меня есть подкласс SKNode, который защищает мой SKSpriteNode, который показывает эмблему достижения и SKLabelNode названия заголовка достижения и сумму, необходимую для разблокирования достижения. Как показано ниже:

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

Как добавить один в переменную суммы, а затем обновить текст, чтобы он отображал новую сумму на экране?

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"

PS Не забудьте использовать строчные буквы для переменных, чтобы не путать их с типами классов: как правило, это считается плохим отношением.

Другие вопросы по тегам