2015-05-31 57 views
5

我正在嘗試創建我的第一個sprite套件swift遊戲,並且我的遊戲數據使用nsuserdefaults工作。我想讓它更安全,因此我試圖轉換到NSCoding,但是我在網上找到的東西完全幫助了我,並且讓我感到困惑(如果答案已經存在,那麼很抱歉,我可能已經看過它並且沒有「T能夠理解)從NSUserDefaults更改爲NSCoding

這是我的遊戲狀態類:

class GameState { 
var score: Int 
var highScore: Int 
var stars: Int 
var sound: Bool 
var carType: Int 
var xSize: Double 
var ySize: Double 
var gameOver: Bool 

class var sharedInstance: GameState { 
    struct Singleton { 
     static let instance = GameState() 
    } 

    return Singleton.instance 
} 

init() { 
    // Init 
    score = 0 
    highScore = 0 
    stars = 0 
    carType = 1 
    sound = true 
    xSize = 1 
    ySize = 1 
    gameOver = false 

    // Load game state 
    let defaults = NSUserDefaults.standardUserDefaults() 

    highScore = defaults.integerForKey("highScore") 
    stars = defaults.integerForKey("stars") 
    sound = defaults.boolForKey("sound") 
    carType = defaults.integerForKey("carType") 
    xSize = defaults.doubleForKey("xSize") 
    ySize = defaults.doubleForKey("ySize") 
    gameOver = defaults.boolForKey("gameOver") 
} 


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") 
    defaults.setBool(sound, forKey: "sound") 
    defaults.setInteger(carType, forKey: "carType") 
    defaults.setDouble(xSize, forKey: "xSize") 
    defaults.setDouble(ySize, forKey: "ySize") 
    defaults.setBool(gameOver, forKey: "gameOver") 
    NSUserDefaults.standardUserDefaults().synchronize() 
} } 

,我保存在我的其他類裝載數據使用:

GameState.sharedInstance.***** 

我怎麼會去改變這種實現NSCoding,然後加載並保存來自其他類的數據?謝謝。

回答

2

要保存的課程必須符合NSCoding協議並實施required init(coder aDecoder: NSCoder)func encodeWithCoder(aCoder: NSCoder)

這裏有一個簡單的例子:

class GameState: NSObject, NSCoding { 

    var score: Int? 
    var gameOver: Bool? 

    init(score: Int, gameOver: Bool) { 
     super.init() 
     self.score = score 
     self.gameOver = gameOver 
    } 

    required init(coder aDecoder: NSCoder) { 
     self.score = aDecoder.decodeObjectForKey("score") as? Int 
     self.gameOver = aDecoder.decodeObjectForKey("gameOver") as? Bool 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(self.score, forKey: "score") 
     aCoder.encodeObject(self.gameOver, forKey: "gameOver") 
    } 

} 

let myGameState = GameState(score: 42, gameOver: true) 

然後你就可以在AppDelegate中使用NSKeyedArchiverNSKeyedUnarchiver,例如,保存和加載你的對象作爲數據:

func applicationWillTerminate(aNotification: NSNotification) { 
    NSKeyedArchiver.archiveRootObject(myGameState, toFile: "a/file/path") 
} 

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    if let data = NSKeyedUnarchiver.unarchiveObjectWithFile("a/file/path") as? GameState { 
     myGameState = data 
    } 
} 
+0

感謝您的回覆,只有幾個問題: 是'let myGameState ...'你用什麼來代替最初的init()類來爲每個變量添加值? 我將如何更新其他類的遊戲狀態? (更新分數和聲音等) 謝謝 – AEkon

+0

不客氣。這只是一個初始參數,我爲我的例子所做的,你不必改變你的。您只需實施「必需」一個,並確保您要加載的所有屬性都在此處聲明。 – Moritz

+0

哦,好吧,生病了,再次感謝! forfile在appdelegate中,我將它保存到正在使用的手機中?謝謝 – AEkon