【问题标题】:Setting Up HighScore in Swift and Sprite Kit using NSuserdefaults使用 NSuserdefaults 在 Swift 和 Sprite Kit 中设置 HighScore
【发布时间】:2023-03-08 10:34:01
【问题描述】:

我正在构建一个快速游戏并且需要设置一个高分,我一直在尝试弄清楚如何去做。所以请你告诉我如何搜索这个库,看看是否有一个已经保存的高分,然后将它与用户的分数进行比较。我试过用这个出来,但它不起作用。请帮助并尽可能清楚。给我示例代码将不胜感激。

    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()
   }

【问题讨论】:

  • 为什么不使用 iCloud?假设用户将卸载应用程序或将在其他设备上运行...
  • it won't work 是什么意思?
  • 我的意思是我自己做不到@POB

标签: xcode swift nsuserdefaults


【解决方案1】:

使用 Single View Application 模板在 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 &gt; 0NSUserDefaults.standardUserDefaults().integerForKey("highscore") 将获得这个新值。

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

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

如果你重建你的项目并重新启动它,你会看到NSUserDefaults.standardUserDefaults().integerForKey("highscore") 是持久的(它的值仍然是 12 并且没有被重置)。因此,NSUserDefaults 可以成为存储玩家最高分数的完美工具。


额外提示

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

【讨论】:

  • 这正是我所需要的。我现在可以看到它是如何运作的。非常感谢@POB
【解决方案2】:
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)")

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多