我有一个游戏,我想随着时间的推移更新“能量”条。所以玩家每 5 分钟应该多获得 1 点能量来使用。我知道如何在单个场景中执行此操作,但无论您在什么场景以及在后台,这都应该更新,但我正在努力寻找如何最好地实现这一点。
关于背景,我想我已经了解了。当应用程序被发送到后台时,我存储时间,当它再次进入前台时,我得到当前时间并计算出它们应该获得多少能量。
我正在苦苦挣扎的是跨场景管理它并相应地更新 UI 的最佳方式(我计划在所有屏幕的左上角显示它)。我的第一个想法是拥有一个读取存储的能量水平并具有计时器(在 sprite 套件更新循环之外)的单例对象。这每 5 分钟运行一次并更新能量水平。然后它可以发布通知,以便任何非 SpriteKit View 都可以显示当前能量,类似地,任何 SpriteKit 场景都可以只使用更新循环来读取值并相应地显示它。但我不确定这是否是一种有效的方法。
我是否应该只在 appdelegate 上附加一个对象来执行类似于 Singleton 的操作。这将使我能够轻松比较应用程序再次激活的时间(例如,如果它是 2.5 分钟以刷新能量级别)
任何人都可以建议这是一个好的方法还是有更好的方法来实现这个目标?
最佳答案
如果我理解正确的话,你在这里有两个问题;一种是关于无论场景如何显示能量条,另一种是用于计算应用程序关闭期间获得的能量。
第一个问题(所有场景显示能量条)你应该看看SKReferenceNode
我在我的一个带有全局菜单的游戏中做了这样的事情: 我为菜单创建了一个单独的 SpriteKit 场景(.sks 文件)。然后我在 GameScene.sks 文件中添加了 SKReferenceNode。在 GameScene.swift 文件中,我只是将 ReferenceNode 视为普通的 SKSpriteNode,如下所示:
class GameScene: SKScene {
// Reference node added in GameScene.sks
var playerHealthBar : SKSpriteNode!
override func didMove(to view: SKView) {
// Reference node
playerHealthBar = self.childNode(withName: “//playerHealthBar”) as? SKSpriteNode
}
使用 SKReferenceNode,您可以在我们所有的场景中实现该节点。然后您就可以随时更新节点。我使用该方法在我的游戏中创建全局菜单栏(可以显示用户金币、健康点等)
对于有关玩家健康栏的数据(例如健康点),您可以从 UserDefaults 加载/保存它。
对于第二个问题,一个想法是在 UserDefaults 中存储一个名为 lastActive
的变量。当应用程序进入后台时更新此值。
当应用程序进入前台时,您需要将当前时间与 lastActive
变量进行比较。
看看这个:
func timeSpentAwayInSeconds() -> Int {
// We then check when the player was last active
let lastActive = UserDefaults.standard.object(forKey: "lastActive")
// Then we compare that to the current date
let elapsedTime = Date().timeIntervalSince(lastActive as! Date)
// Covert that to seconds
let elapsedTimeInSeconds : Int = Int(elapsedTime)
return elapsedTimeInSeconds
}
希望对您有所帮助。如果它解决了您的问题,请标记为已回答:-)
编码愉快!
关于swift - SpriteKit - 跨多个场景随时间更新能量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54741943/