Обновление текста 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 Не забудьте использовать строчные буквы для переменных, чтобы не путать их с типами классов: как правило, это считается плохим отношением.