通过SKNode子类

时间:2016-12-07 13:00:16

标签: swift sprite-kit sknode sklabelnode

我的目标:在Achievements Class的amount变量中添加一个,然后更新文本,使其显示在名为“AmountLabel”的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的另一个类中,如下所示:

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类的另一个函数中,我试图通过节点树枚举,以便能够更新标签以将其添加到其amount变量,然后更新其文本,如下所示:

 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 个答案:

答案 0 :(得分: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 不要忘记使用小写的变量来将这些变量与类型混淆:通常认为这是一种不好的态度..