如何使用NSUserDefaults将项添加到NSMutableArray

时间:2014-05-01 03:28:43

标签: ios objective-c nsmutablearray sprite-kit

我正在制作游戏,它有50个等级。我希望在完成之前的级别后解锁每个级别。现在我设置50 SKSpriteNodes标记为1到50,因此它们是编号级别。我希望NSUserDefaults告诉级别选择屏幕,当级别完成时用户已解锁新级别。 (即,如果用户完成级别2,则解锁级别3)。我试图按照这个问题的解决方案How to save NSMutablearray in NSUserDefaults但是它不适合我,因为我不确定如何在级别选择菜单和当前的NSMutableArray中水平本身。

这是我尝试过的一些代码:

[[NSUserDefaults standardUserDefaults] setObject:levelAchieved forKey:@"level2"];
[[NSUserDefaults standardUserDefaults] synchronize];

当用户完成1级

时,我使用了这个

然后我试着说这个:

NSMutableArray *levelAchieved = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"level2"] mutableCopy];

告诉关卡选择场景用户已达到新关卡并在该场景中解锁。

但这不起作用,因为我无法在两个场景中都有阵列,即使我确定导入了NSMutableArray *levelAchieved的头文件。

如何正确添加到数组中,但此外 - >这是接近这类事物的正确方法吗?是否有不同的方法来解锁两个场景之间的一系列关卡?

2 个答案:

答案 0 :(得分:1)

NSUserDefaults是一种有效的方法,可以持久保存信息并在多个类中访问它,因此从这个角度来看,您的技术没有任何问题。

我要看的是需要存储 50 不同的值。如果级别只能按顺序解锁 - 即您必须先完成1-39级别才能尝试级别40,那么您需要做的就是存储一个代表最高完成级别的NSInteger。

e.g。当你完成38级时,你会做类似

的事情
NSInteger highLevel=38;
[[NSUserDefaults standardUserDefaults] setInteger:highLevel forKey:@"highLevel"];

第一次运行应用时,您需要将NSUserDefault值设置为0。

如果没有看到您的代码,我无法准确地为您提供下一位,但它会是这样的:

NSInteger highLevel=[[NSUserDefaults standardUserDefaults] integerForKey:@"highLevel"];

for (int i=0;i<NUMBEROFLEVELS;i++)
{
    if (i<=highLevel) {
        // TODO Display unlocked level button
    }
    else {
        // TODO Display locked level button
    }
}

请注意,将highLevel设置为0实际上会解锁级别1,因为数组的第一个元素实际上是0.当highLevel为1时,元素0和1(级别1和2)将被解锁,依此类推......

答案 1 :(得分:0)

是否可以只存储NSUserDefaults中完成的最高级别的NSString,而不是完整的NSMutableArray(或索引值的NSInteger)。因为您只是按顺序模式解锁级别。如果用户完成了级别7之前的所有级别,那么您只需存储level7(或者objectAtIndex的值为6)。然后在您的代码中显示阵列中的所有对象,最高级别为+ 1,表示显示级别1到8(也就是索引0到7)。