2016-12-07 13 views
2

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

Поэтому у меня есть подкласс 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)") 

    } 

} 

они затем добавляются в другой класс под названием ДостижениеMenu вот так:

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

     } 
    } 
} 

, но каждый раз, когда я пытаюсь и привести переменную в качестве фактического класса он дает мне ошибку:

Could not cast value of type 'SKLabelNode' (0x10e5edb08) to 'Astrum.Achievements' (0x10c899438).

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

ответ

2

Чтобы избежать ошибки произнесения вы можете проверить тип узла, как:

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

+0

Достигнет ли это того, чего я хочу с точки зрения добавления к переменной суммы и обновления текст? – Astrum

+0

В точный момент, когда вы получаете достижения, вы также можете запускать достижения .UpdateText() и доступ к сумме var –

+0

Итак, я просто обращаюсь к нему после утверждения let и после кастинга в качестве класса? – Astrum