【问题标题】:Display high score in a new scene with NSUserDefault in swift spriteKit在 swift spriteKit 中使用 NSUserDefault 在新场景中显示高分
【发布时间】:2015-06-18 16:08:32
【问题描述】:

我正在使用 SpriteKit 制作游戏,它可以保存玩家的高分。当游戏结束时,它会转换到不同的场景(endScene)。我不知道如何在 endScene 中显示高分。我的高分代码:

func updateHighScore(){
    //save current points label value
    let pointsLabel = childNodeWithName("pointsLabel") as! DDPointsLabel
    let highScoreLabel = childNodeWithName("highScoreLabel") as! DDPointsLabel

    if highScoreLabel.number < pointsLabel.number {
        highScoreLabel.setTo(pointsLabel.number)

        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setInteger(highScoreLabel.number, forKey: "highscore")
    }
}

func loadHighScore(){
    let defaults = NSUserDefaults.standardUserDefaults()
    let highScoreLabel = childNodeWithName("highScoreLabel") as! DDPointsLabel
    highScoreLabel.setTo(defaults.integerForKey("highscore"))

}

【问题讨论】:

标签: swift sprite-kit nsuserdefaults skscene


【解决方案1】:

要加载高分,您将需要一个 int 来保存高分,我不确定您要对 highScoreLabel 做什么,但要加载它,您将执行 var highScore = defaults.integerForKey("highScore") 并为您的标签可以做highScoreLabel.text = "Score \(highScore)"

【讨论】:

    【解决方案2】:

    此答案假设您在 GameScene 中正确显示了分数。如果是这样,那么除了 GameScene 文件之外,还要创建另外两个 Swift 文件:1) GameState.swift 和 2) EndGameScene.swift。

    在 GameState.swift 中,像这样创建一个共享实例 ...

    class GameState {
      var score: Int
      var highScore: Int
    
    
      class var sharedInstance: GameState {
        struct Singleton {
          static let instance = GameState()
        }
    
        return Singleton.instance
      }
    
    
        init() {
          score = 0
          highScore = 0
    
          // Load game state
          let defaults = NSUserDefaults.standardUserDefaults()
    
          highScore = defaults.integerForKey("highScore")
          stars = defaults.integerForKey("stars")
        }
    
        func saveState() {
    
          // Update highScore if the current score is greater
          highScore = max(score, highScore)
    
          // Store in user defaults
          let defaults = NSUserDefaults.standardUserDefaults()
          defaults.setInteger(highScore, forKey: "highScore")
          defaults.setInteger(stars, forKey: "stars")
          NSUserDefaults.standardUserDefaults().synchronize()
        }
    }
    

    在 GameScene 文件中,确保您正确创建了标签。如果是这样,请找到为您的播放器创建积分的代码。也许发生碰撞的地方。然后添加 GameState 共享实例。它看起来像这样......

    lblStars.text = String(format: "X %d", GameState.sharedInstance.stars)
    lblScore.text = String(format: "%d", GameState.sharedInstance.score)
    

    在您的 EndGameScene 中,确保您使用标签调用 GameState.sharedInstance。代码看起来像这样...

        // Score
        let lblScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
        lblScore.fontSize = 60
        lblScore.fontColor = SKColor.whiteColor()
        lblScore.position = CGPoint(x: self.size.width / 2, y: 300)
        lblScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
        lblScore.text = String(format: "%d", GameState.sharedInstance.score)
        addChild(lblScore)
    
        // High Score
        let lblHighScore = SKLabelNode(fontNamed: "ChalkboardSE-Bold")
        lblHighScore.fontSize = 30
        lblHighScore.fontColor = SKColor.cyanColor()
        lblHighScore.position = CGPoint(x: self.size.width / 2, y: 150)
        lblHighScore.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center
        lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)
        addChild(lblHighScore)
    

    然后,回到 GameScene,添加一个 gameOver 属性 ...

    var gameOver = false
    

    还是在GameScene中,添加这个方法:

    func endGame() {
    
      gameOver = true
    
      // Save high score
      GameState.sharedInstance.saveState()
    
      let reveal = SKTransition.fadeWithDuration(0.5)
      let endGameScene = EndGameScene(size: self.size)
      self.view!.presentScene(endGameScene, transition: reveal)
    }
    

    一定要打电话……

    endGame() 
    

    ...玩家生命耗尽的地方。

    您可能需要添加:

    if gameOver {
      return 
    }
    

    ... 在 GameScene 中,游戏玩法被更新。

    如需更多帮助,您应该使用 Google ray wenderlich uberjump 第 2 部分。该教程中有关于保存和显示游戏分数的很好的信息和代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多