【问题标题】:Retrieve and Instantly Update High Score From Two Separate SKScene's从两个单独的 SKScene 中检索并立即更新高分
【发布时间】:2017-10-25 23:11:55
【问题描述】:

在我的 GameScene 中,我在游戏结束时通过 UserDefaults 保存了一个分数。下面是我保存分数的 GameScene 代码。

var totalPoints = 0 {
        didSet {
            score.text = " \(totalPoints)"
            UserDefaults.standard.set(totalPoints, forKey: "scoreDefaults")
        }
    }

一旦玩家失去所有生命,游戏就会让您返回主菜单场景。在这个场景中,如果玩家最后的分数高于他们之前的高分,我想立即检索并更新主菜单场景中的高分数字。但由于某种原因,它只是不断更新用户在游戏结束时获得的每个分数,无论它是高于还是低于上一个高分。我究竟做错了什么?下面是我的主菜单场景。当我打印“newScore”和“getScore”时,我确实看到了正确的值,但是当涉及到在需要时更新高分时,我的代码肯定是错误的。

let getScore:Int = UserDefaults.standard.integer(forKey: "scoreDefaults")

    override func didMove(to view: SKView) {        


    if ((UserDefaults.standard.integer(forKey: "updateHighScoreDefaults")) >= 0) {
                highScore.text = " \(newScore)"
            } else {
                print("I don't know")
            }

            if (getScore > newScore) {
                print("New High Score!")
                newScore = getScore
                //print(newScore)
                UserDefaults.standard.set(newScore, forKey: "updateHighScoreDefaults")
                highScore.text = " \(newScore)"
            } else {
                print("Not a high score")
                UserDefaults.standard.set(newScore, forKey: "updateHighScoreDefaults")
                highScore.text = " \(newScore)"
            } 
    }

【问题讨论】:

    标签: swift sprite-kit skscene userdefaults


    【解决方案1】:

    你的钥匙错了scoreDefaults vs updateHighScoreDefaults Pick 1

    另外,getScore 只被调用一次,改为将其设为计算属性

    var getScore:Int {return UserDefaults.standard.integer(forKey: "updateHighScoreDefaults")}

    override func didMove(to view: SKView) {        
    
            if (getScore > newScore) {
                print("New High Score!")
                newScore = getScore
                //print(newScore)
                UserDefaults.standard.set(newScore, forKey: "updateHighScoreDefaults")
    
                highScore.text = " \(newScore)"
            } else {
                print("Not a high score")
                UserDefaults.standard.set(newScore, forKey: "updateHighScoreDefaults")
                highScore.text = " \(newScore)"
            } 
            UserDefaults.syncronize()
    }
    

    【讨论】:

    • 我应该将我的代码移动到更新函数,以便它立即更新高分还是 didMove 可以?
    • 如果您想不断更新,请在didSetnewScore 上执行此操作。我不知道你在做什么,我只是假设这是一个高分场景或什么的。
    • 请再看看我的代码。如您所见,我有两个不同的键,因为我想通过“scoreDefaults”从 GameScene 获取 originaql 分数并想保存它(newScore,forKey:“updateHighScoreDefaults”),这样我就可以不断更新高分每次玩家打开应用程序时,通过 updateHighScoreDefaults 主菜单。希望这是有道理的!
    • 但是你从来没有读过updateHighScoreDefaults 我不建议使用UserDefaults 作为共享数据的手段,我知道你可以做到,并不意味着这是一个好方法。 UserDefaults 应该用作将应用程序设置保持在特定状态的一种方式。我建议使用每个场景中的 userData 来获取从 GameScene 到 MenuScene 的分数,然后使用 UserDefaults 保存到设备
    • 您不需要示例,只需在苹果文档中查找即可。 userData 是附加到节点的字典引用,其他一切都应该是对字典如何工作的基本了解
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2019-08-22
    • 2011-05-03
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多