2016-12-07 62 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