1. 程式人生 > >應用UserDefaults儲存遊戲分數和最高分

應用UserDefaults儲存遊戲分數和最高分

補充 傳送門 sets ttl 程序 node vat 單例 nsnumber

應用UserDefaults儲存遊戲分數和最高分

我們在GameScene.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"))" // 取出沙盒中的最高分數
技術分享圖片
取出沙盒中的分數,並分別把當前分數、最高分數顯示在LoseScene場景當中

代碼如下:

 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之間是無法互相訪問數據的,其目錄結構為:

技術分享圖片
每個應用程序都有對應的私有目錄,其根目錄為Home目錄。該目錄下又三個文件夾:Documents、Library、tmp 技術分享圖片
UserDefaults的存放位置

每個iOS應用都有自己的應用沙盒(應用沙盒就是文件系統目錄),與其他文件系統隔離。應用必須待在自己的沙盒裏,其他應用不能訪問該沙盒。沙盒下的目錄如下:

Documents: 保存應?運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。例如,遊戲應用可將遊戲存檔保存在該目錄。

tmp: 保存應?運行時所需的臨時數據,使?完畢後再將相應的文件從該目錄刪除。應用 沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。

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

應用UserDefaults儲存遊戲分數和最高分