【发布时间】:2018-05-29 14:27:26
【问题描述】:
现在的游戏玩法有多个关卡,每个关卡都有一个秘密物品(一颗豆子),玩家在每个关卡的每个存档文件中只能找到一次。这个想法是,如果玩家可以在每个关卡中找到每个秘密豆子,一旦他们完成游戏,他们就会获得奖励。我通过用户默认值跟踪玩家何时在每个关卡中找到或没有找到秘密项目,它可以工作,但我的实现很丑陋,我需要帮助。
问题是我无法找到一种有效的方法来在每个级别执行此操作。为了跟踪每个级别的所有这些,我一直在这样做:
//Class gameScene variable this tracks per level if the player found the bean, if so then it's set to true and the bean will not load in the level if the player revisits
var foundBeanLevel1 = UserDefaults().bool(forKey: "FoundBeanLevel1")
var foundBeanLevel2 = UserDefaults().bool(forKey: "FoundBeanLevel2")
这是在每个级别覆盖 didMove(将 1 替换为 X 级别):
if foundBeanLevel1{
let secretBean: SKSpriteNode = childNode(withName: "SecretBean") as! SKSpriteNode
secretBean.removeFromParent()
}
_
//total count, if it's not the sum of the number of levels then the player didn't collect all beans
var secretBeanCount: Int = UserDefaults().integer(forKey: "SavedSecretBean") {
didSet {
//sets the increment to user defaults
UserDefaults().set(secretBeanCount, forKey: "SavedSecretBean")
}
}
//didContact
if node.name == SecretBean{
secretBeanCount += 1
if levelCheck == 1 {
UserDefaults().set(true, forKey: "FoundBeanLevel1")
} else if levelCheck == 2 {
UserDefaults().set(true, forKey: "FoundBeanLevel2")
}
}
然后如果他们开始新游戏:
UserDefaults().set(0, forKey: "SavedSecretBean")
UserDefaults().set(false, forKey: "FoundBeanLevel1")
UserDefaults().set(false, forKey: "FoundBeanLevel2")
这个系统按预期工作,但我知道它非常草率。此外,我获得的级别越多,这些 else if 语句就会变得越大。我知道有更好的方法可以做到这一点,但我不确定在这方面我在寻找什么。任何建议将不胜感激。
【问题讨论】:
-
UserDefaults 并不是真正设计为您的“保存”文件。我建议您学习如何使用编码协议进行保存,这样您可以保存到磁盘,而不必担心 UserDefaults 的性能问题,因为您超出了为其分配的缓存大小。
标签: ios swift sprite-kit nsuserdefaults userdefaults