使用NSuserdefaults在Swift和Sprite Kit中设置HighScore



我正在构建一个快速游戏,需要设置一个高核心,我已经想办法做了一段时间。所以,请你告诉我如何搜索这个库,看看是否有已经保存的高分,然后将其与用户的分数进行比较。我试过想出这个办法,但行不通。请帮助并尽可能清楚。如果能给我示例代码,我将不胜感激。

    if let highscore: AnyObject = NSUserDefaults.valueForKey("highscore") { 
      var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("highScore") as Int
        if ( savedScore < Score) { 
            var highscore = Score
            NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
            NSUserDefaults.standardUserDefaults().synchronize() }
    }
    else { 
        var highscore = Score
        NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
        NSUserDefaults.standardUserDefaults().synchronize()
   }

使用单视图应用程序模板在Xcode中创建一个新的iOS项目。然后,将ViewController.swift的内容替换为以下代码:

import UIKit
class ViewController: UIViewController {
    
    var generator = [6, 12, 8].generate()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(type: .System)
        button.setTitle("Button", forState: .Normal)
        button.addTarget(self, action: "newScore", forControlEvents: .TouchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)
        
        // Auto layout code using anchors (requires iOS9+)
        let horizontalConstraint = button.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
        let verticalConstraint = button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
        NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint])
        
        // Print NSUserDefaults's highscore value when app is launched
        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }
    
    func newScore() {
        guard let score = generator.next() else { return }
        print("current score:", score)
        //Check if score is higher than NSUserDefaults stored value and change NSUserDefaults stored value if it's true
        if score > NSUserDefaults.standardUserDefaults().integerForKey("highscore") {
            NSUserDefaults.standardUserDefaults().setInteger(score, forKey: "highscore")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
        
        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }
    
}

在iPhone或模拟器上构建并运行项目。Xcode控制台将打印0,这是NSUserDefaults.standardUserDefaults().integerForKey("highscore")的当前值。

现在,点击按钮。这将把score的值设置为6,并且由于6 > 0NSUserDefaults.standardUserDefaults().integerForKey("highscore")将获得这个新值。

再次单击按钮。这将把score的值设置为12。您将立即在控制台中看到NSUserDefaults.standardUserDefaults().integerForKey("highscore")获得这个新值。

现在,如果您通过单击按钮将score的值更改为8,您将看到NSUserDefaults.standardUserDefaults().integerForKey("highscore")仍然具有12的值,因为8 < 12

如果您重新构建项目并重新启动它,您将看到NSUserDefaults.standardUserDefaults().integerForKey("highscore")是持久的(其值仍然是12,并且尚未重置)。因此,NSUserDefaults可以作为一个完美的工具来存储玩家的最高分数。


额外小费

NSUserDefaults.standardUserDefaults().integerForKey("highscore")总是返回一个Int(如果您没有自己设置,它将返回0,而不是nil)。因此,你不需要/不能使用可选绑定。如果你真的想处理可选值返回,你会更喜欢NSUserDefaults.standardUserDefaults().objectForKey("highscore") as? Int

var defaults=NSUserDefaults()
var highscore=defaults.integerForKey("highscore")
if(Score>highscore)
{
    defaults.setInteger(Score, forKey: "highscore")
}
var highscoreshow=defaults.integerForKey("highscore")
lblHighScore.text="(highscoreshow)"
println("hhScore reported: (lblHighScore.text)")
lblPlayScore.text="(Score)"
println("play reported: (lblPlayScore.text)")

最新更新