• 应用UserDefaults储存游戏分数和最高分


    应用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场景当中
    取出沙盒中的分数,并分别把当前分数、最高分数显示在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
    每个应用程序都有对应的私有目录,其根目录为Home目录。该目录下又三个文件夹:Documents、Library、tmp
    UserDefaults的存放位置
    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

  • 相关阅读:
    罗杨美慧 20180912-3 词频统计
    罗杨美慧 20190912-2 命令行
    罗杨美慧 20190905-1 每周例行报告
    罗杨美慧 20190905-2 博客作业
    20190919-4 测试,结对要求
    孙晓宇-20190912-1 每周例行报告
    孙晓宇-20180912-3 词频统计
    (第二周)孙晓宇20190912-2 命令行
    孙晓宇20190905-2 博客作业
    孙晓宇20190905-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/apiapia/p/9528741.html
Copyright © 2020-2023  润新知