我正在制作游戏,它有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
的头文件。
如何正确添加到数组中,但此外 - >这是接近这类事物的正确方法吗?是否有不同的方法来解锁两个场景之间的一系列关卡?
答案 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)。