2016-12-07 57 views
2

我的目標:添加一個到成果二等量變量,然後更新文本,使其顯示在所謂的「AmountLabel」更新SKLabel文本通過SKNode子

所以我有一個子類的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像這樣:

在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) 
} 

然後更新它的文本,像這樣:

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

如何添加一個到量變量,然後更新文本,使其顯示新的金額在scre上恩?

回答

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

在獲得成就的確切時刻,您也可以啓動achievement.UpdateText()並訪問量var –

+0

因此,我只是在let語句之後和作爲類的投射之後訪問它。 – Astrum