从两个单独的 SKScene 中检索并立即更新高分

Posted

技术标签:

【中文标题】从两个单独的 SKScene 中检索并立即更新高分【英文标题】:Retrieve and Instantly Update High Score From Two Separate SKScene's 【发布时间】: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)"
             
    

【问题讨论】:

【参考方案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 是附加到节点的字典引用,其他一切都应该是对字典如何工作的基本了解

以上是关于从两个单独的 SKScene 中检索并立即更新高分的主要内容,如果未能解决你的问题,请参考以下文章

SKScene 识别 GameScene 的高分

无法从 C 中的 Berkeley DB 检索值

如何从 Sprite Kit 场景中引用当前的 Viewcontroller

在 Sprite Kit 中组合多个 SKScene

在 SQL 中检索记录后立即更新表

Firebase - iOS Swift:使用从两个单独的子节点检索到的数据加载表格视图单元格