首页 > 解决方案 > 在 spritekit 中的某种数组、类或结构中存储多个 userdefaults 变量?

问题描述

现在游戏玩法有多个关卡,每个关卡都有一个秘密物品(一个豆子),玩家在每个关卡每个保存文件中只能找到一次。这个想法是,如果玩家可以在每个关卡中找到每个秘密豆子,一旦他们完成游戏,他们就会获得奖励。我通过用户默认值跟踪玩家何时在每个关卡中找到或没有找到秘密项目,它可以工作,但我的实现很丑陋,我需要帮助。

问题是我无法围绕每个级别执行此操作的有效方法。为了跟踪每个级别的所有这些,我一直在这样做:

//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 语句就会变得越大。我知道有更好的方法可以做到这一点,但我不确定在这方面我在寻找什么。任何建议将不胜感激。

标签: iosswiftsprite-kitnsuserdefaultsuserdefaults

解决方案


您可以考虑将 bean 级别数字存储在Set

var beanLevels = Set<Int>()
beanLevels.insert(1)
beanLevels.insert(3)
beanLevels.insert(1)

集合确保一个元素只存储一次,因此在上面的示例中,集合将只包含 1 和 3。

使用一组成员资格测试非常简单:

if beanLevels.contains(1) {
    // ...
}

另外,你不再需要了SavedSecretBean。相反,您可以通过以下方式测试集合是否包含任何 bean:

if beanLevels.isEmpty {
    // ...
}

通过将集合转换为数组,您可以轻松地将其保存UserDefaults并从那里恢复:

// Save
let beanLevelsArray = Array(beanLevels)
UserDefaults.standard.set(beanLevelsArray, forKey: "Bean Levels")

// Restore
if let beanLevelsArray = UserDefaults.standard.array(forKey: "beanLevels") as? [Int] {
    let beanLevels = Set(beanLevelsArray)
}

通过这种方式,您无需根据游戏中的关卡数量静态配置变量。


推荐阅读