NSUserDefaults 不仅仅是保存高分
NSUserDefaults not simply saving high score
它应该是当我的玩家达到新的高分时,它会在 GameOver 场景中显示,但在这种情况下,它并没有这样做。我的所有 NSUserDefaults 都在单独的 .swift 文件中。
这是我的代码:
import Foundation
class GameState {
var score: Int
var highScore: Int
var stars: Int
class var sharedInstance :GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
init() {
// Init
score = 0
highScore = 0
stars = 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: "highScoreLabel")
defaults.setInteger(stars, forKey: "stars")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
在我的 GameOver 场景中,我将所有文本标签设置如下:
lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)
在我的 GameScene 中,我有它,所以它 应该 在游戏结束时同步:
func endGame() {
gameOver = true
GameState.sharedInstance.saveState() //right here
print("saved score")
let reveal = SKTransition.fadeWithDuration(0.5)
let gameScene = GameOver(size: self.scene!.size)
view!.presentScene(gameScene, transition: reveal)
print("new scene")
}
是不是少了什么?如有必要,将 post 更多代码。
您可能忽略了编码中的一个问题:
您正在保存为 "highScoreLabel"
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(highScore, forKey: "highScoreLabel")
defaults.setInteger(stars, forKey: "stars")
defaults.synchronize()
但试图读作 "highScore"
highScore = defaults.integerForKey("highScore")
读取和写入 NSUserDefaults
时应使用相同的密钥
供将来参考...
我个人在处理键时设置静态 let 变量。这样你以后就再也不会来打嗝了
struct Defaults {
static let HighScore = "highScore"
static let Stars = "stars"
}
然后使用
highScore = defaults.integerForKey(Defaults.HighScore)
问题是 none 个变量被更改,代码替换为:
class GameState {
var highScore: Int
var stars: Int
class var sharedInstance :GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
init() {
// Load game state
highScore = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.HighScore) ?? 0
stars = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.Stars) ?? 0
}
func saveState(score: Int) {
// Update highScore if the current score is greater
highScore = max(score, highScore)
// Store in user defaults
NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: Defaults.HighScore)
NSUserDefaults.standardUserDefaults().setInteger(stars, forKey: Defaults.Stars)
NSUserDefaults.standardUserDefaults().synchronize()
}
}
它应该是当我的玩家达到新的高分时,它会在 GameOver 场景中显示,但在这种情况下,它并没有这样做。我的所有 NSUserDefaults 都在单独的 .swift 文件中。
这是我的代码:
import Foundation
class GameState {
var score: Int
var highScore: Int
var stars: Int
class var sharedInstance :GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
init() {
// Init
score = 0
highScore = 0
stars = 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: "highScoreLabel")
defaults.setInteger(stars, forKey: "stars")
NSUserDefaults.standardUserDefaults().synchronize()
}
}
在我的 GameOver 场景中,我将所有文本标签设置如下:
lblHighScore.text = String(format: "High Score: %d", GameState.sharedInstance.highScore)
在我的 GameScene 中,我有它,所以它 应该 在游戏结束时同步:
func endGame() {
gameOver = true
GameState.sharedInstance.saveState() //right here
print("saved score")
let reveal = SKTransition.fadeWithDuration(0.5)
let gameScene = GameOver(size: self.scene!.size)
view!.presentScene(gameScene, transition: reveal)
print("new scene")
}
是不是少了什么?如有必要,将 post 更多代码。
您可能忽略了编码中的一个问题:
您正在保存为 "highScoreLabel"
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setInteger(highScore, forKey: "highScoreLabel")
defaults.setInteger(stars, forKey: "stars")
defaults.synchronize()
但试图读作 "highScore"
highScore = defaults.integerForKey("highScore")
读取和写入 NSUserDefaults
供将来参考...
我个人在处理键时设置静态 let 变量。这样你以后就再也不会来打嗝了
struct Defaults {
static let HighScore = "highScore"
static let Stars = "stars"
}
然后使用
highScore = defaults.integerForKey(Defaults.HighScore)
问题是 none 个变量被更改,代码替换为:
class GameState {
var highScore: Int
var stars: Int
class var sharedInstance :GameState {
struct Singleton {
static let instance = GameState()
}
return Singleton.instance
}
init() {
// Load game state
highScore = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.HighScore) ?? 0
stars = NSUserDefaults.standardUserDefaults().integerForKey(Defaults.Stars) ?? 0
}
func saveState(score: Int) {
// Update highScore if the current score is greater
highScore = max(score, highScore)
// Store in user defaults
NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: Defaults.HighScore)
NSUserDefaults.standardUserDefaults().setInteger(stars, forKey: Defaults.Stars)
NSUserDefaults.standardUserDefaults().synchronize()
}
}