應用UserDefaults儲存遊戲分數和最高分node
咱們在GameScene.swift裏swift
private var currentScore:SKLabelNode! // 當前分數節點 private var cScore:Int = 0 /// Int 存當前分數 private var highScore:SKLabelNode! // 最高分數 private var hScore:Int = 0 /// Int 存最高分數
在子彈擊中外星人時記錄分數
func bulletHitAlien(nodeA:SKSpriteNode,nodeB:SKSpriteNode){}緩存
func bulletHitAlien(nodeA:SKSpriteNode,nodeB:SKSpriteNode){ // 分數統計 cScore += 1 currentScore.text = "SCORE:\(cScore)" // 保存當前分數 UserDefaults.standard.set(cScore, forKey: "CURRENTSCORE") if cScore > hScore { hScore = cScore highScore.text = "High:\(hScore)" // 保存最高分數 UserDefaults.standard.set(cScore, forKey: "HIGHSCORE") } }
咱們應用UserDefaults.standard.set方法,分別儲存當前分數和最高分數對應的鍵值forKey:CURRENTSCORE和HIGHSCORE,而後,在遊戲結束的場景LoseScene.swift經過UserDefaults.standard.integer(forKey: "CURRENTSCORE")取出存在手機沙盒裏的值;網絡
currentScore.text = "SCORE:\(UserDefaults.standard.integer(forKey: "CURRENTSCORE"))" // 取出當前分數 highScore.text = "HIGH SCORE:\(UserDefaults.standard.integer(forKey: "HIGHSCORE"))" // 取出沙盒中的最高分數
代碼以下:app
private var currentScore:SKLabelNode! // 當局分數 private var highScore:SKLabelNode! // 最高分數 override func didMove(to view: SKView) { // 找到 名稱爲Play的節點 play = childNode(withName: "Play") as! SKSpriteNode currentScore = childNode(withName: "currentScore") as! SKLabelNode highScore = childNode(withName: "highScore") as! SKLabelNode currentScore.text = "SCORE:\(UserDefaults.standard.integer(forKey: "CURRENTSCORE"))" // 取出當前分數 highScore.text = "HIGH SCORE:\(UserDefaults.standard.integer(forKey: "HIGHSCORE"))" // 取出沙盒中的最高分數 }
咱們補充一下有關Swift數據儲存方式的相關知識,數據儲存是存在iOS沙盒的當中,沙盒,顧名思義,即各個app之間是沒法互相訪問數據的,其目錄結構爲:ide
每一個iOS應用都有本身的應用沙盒(應用沙盒就是文件系統目錄),與其餘文件系統隔離。應用必須待在本身的沙盒裏,其餘應用不能訪問該沙盒。沙盒下的目錄以下:spa
Documents: 保存應⽤運行時生成的須要持久化的數據,iTunes同步設備時會備份該目錄。例如,遊戲應用可將遊戲存檔保存在該目錄。code
tmp: 保存應⽤運行時所需的臨時數據,使⽤完畢後再將相應的文件從該目錄刪除。應用 沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。blog
Library/Caches: 保存應用運行時⽣成的須要持久化的數據,iTunes同步設備時不會備份 該目錄。⼀通常存儲體積大、不須要備份的非重要數據,好比網絡數據緩存存儲到Caches下。遊戲
Library/Preference: 保存應用的全部偏好設置,如iOS的Settings(設置) 應⽤會在該目錄中查找應⽤的設置信息。iTunes同步設備時會備份該目錄。
UserDefaults能夠存儲的數據類型:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary,若是把有null的value放入userDefaults,程序會崩。
//存儲基礎類型,以Int爲例。 UserDefaults.standard.set(15, forKey:"theKey") //讀取基礎類型,以Int爲例。 let num = UserDefaults.standard.integer(forKey: "theKey")
注意:不要用UserDefaults儲存用戶的密碼。
補充單例實現存取UserDefaults方法:
// // GameHelper.swift // SpaceBattle // Copyright © 2018 iFiero. All rights reserved. // import Foundation public let bestScoreKey:String = "BEST_SCORE" public let currScoreKey:String = "CURR_SCORE" class GameHelper:NSObject { static let shared:GameHelper = GameHelper() // 建立單例 private override init(){ } // 存取遊戲分數 func setScore(score:Int,scoreKey:String){ //UserDefaults來取當前得分 UserDefaults.standard.set(score, forKey: scoreKey) //沙盒 UserDefaults.standard.synchronize() // 同步 } func getScore(scoreKey:String) -> Int { return UserDefaults.standard.integer(forKey: scoreKey) } }
單例實現存取UserDefaults方法的源碼傳送門:http://www.iFIERO.com/uploads/SpaceBattle_Score.zip
更多遊戲教學:http://www.iFIERO.com