从 Swift 中的 SKSpriteNode 子类更新 SKScene 中保存的游戏分数

Updating game score held in SKScene from a SKSpriteNode subclass in Swift

我们有一个主游戏场景 SKScene,它包含 HUD 逻辑和分数。

我们还有一个对象的子类 SKSpriteNode。当对象被点击时,我们在 SKSpriteNode 子类中处理触摸。

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

我们想要做的是在点击一个游戏场景时更新保存在游戏场景中的分数。如何实现?

I assume that

  1. GameScene 有一个名为 "scoreLabel"
  2. 的 child SKLabelNode
  3. "scoreLabel"显示当前游戏比分
  4. GameScene 有一个名为 "mySprite"
  5. 的 child SKSpriteNode
  6. "mySprite"被点击时,分数必须增加1
  7. GameScene 有一个私有 属性 var score = 0

This is how you should implement touchesBegan:withEvent

class GameScene: SKScene {

    private var score = 0

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if
            let touch = touches.first as? UITouch,
            let tappedSprite = nodeAtPoint(touch.locationInNode(self)) as? SKSpriteNode,
            let scoreLabel = childNodeWithName("scoreLabel") as? SKLabelNode
            where tappedSprite.name == "mySprite" {
                score += 1
                scoreLabel.text = "Score: \(score)"
        }
    }
}

Explanation

第一个条件选择第一个接收到的触摸。如果至少有一个触摸,这将成功。 (理论上这条线永远不会失败。)

第二个条件确实检索了包含触摸点的 SKNode,然后尝试将此节点转换为 SKSpriteNode

第三个条件尝试检索名称为 "scoreLabel"SKLabelNode

where 检查检索到的 sprite 是否具有名称 "mySprite"

如果这 4 个条件都成功,那么私人 属性 分数会增加 1,并且标签的文本会更新。

希望这对您有所帮助。