在iOS Sprite Kit游戏中创建关卡

6
我正在创建一个游戏,并希望它有一个场景,其中包含选择关卡的选项,然后是要玩的关卡。我想知道如何创建关卡,并在用户达到该关卡时保存它。我考虑在ViewController.h中创建一个BOOL,在每个场景中调用它,例如LevelCompleted = YES; 然后在玩新关卡或重新播放先前关卡时使用该布尔值。
或者,
我在每个场景中都有一个BOOL,然后将每个场景的头文件导入到导航关卡的场景中,并使用BOOL来显示该级别是否已解锁。
另外,当应用程序关闭时保存BOOL的值,我该使用NSUserDefaults吗?
我已经搜索了很多关于此的教程,但似乎找不到任何有用的信息。如果需要更多信息,请告诉我。

你对这个问题完全束手无策还是已经尝试过一些可能的解决方案了? - sangony
@sangony,我完全被卡住了,我已经试着调整过了,但似乎没有任何作用,我应该换一种方法来处理吗?使用BOOL是错误的吗? - user3576196
如果您展示一些尝试过的东西并解释为什么它不能按照您的期望工作,那么您可能会得到更好的答案。 - Jesse Rusak
1
这些级别是按照定义的顺序排列的吗,例如从1到100?如果是这样,您只需要跟踪当前级别,即43,并在完成级别时将其提升。如果不是,则需要一个已解锁级别名称的数组或字典,并在玩家完成级别时将其添加到该数组中。 - CodeSmile
它们将按顺序排列。我只需要为每个场景设置int级别编号,然后将所有场景导入到级别导航场景中?并使用NSUserDefaults保存级别编号? @LearnCocos2D - user3576196
1个回答

2
有几种方法可以实现您想要的功能。我将给您一些提示和建议,以便您可以创建适合您游戏的代码。
首先,请记住MyScene是一个SKScene,在SpriteKit项目模板中默认由View Controller调用。因此,您可以创建尽可能多的SKScene类来拥有不同的关卡。每个SKScene类可以是一个关卡。
您可以将第一个SKScene,即MyScene,转换为主菜单,并在此处添加用户选择关卡的列表。要从主菜单(MyScene)进入所选关卡,您可以使用以下代码:
SKScene *gameLevel1 = [[Level1 alloc] initWithSize:self.size];
SKTransition *reveal = [SKTransition doorsOpenVerticalWithDuration:1.0];
[self.view presentScene:gameLevel1 transition:reveal];

Level1将是你第一关的SKScene类的名称。你还可以选择许多出色的过渡效果。根据你的需求,你也可以包含一个scaleMode属性。

正如LearnCocos2D所指出的那样,你可以使用数组或字典来存储玩家的数据,例如物品、健康和达到的级别。除非你需要保存大量数据,否则NSUserDefaults是最好的选择。下面是一个使用NSUserDefaults存储数据的示例:

NSString *valueToSave = @"Level 5";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"levelReached"]
[[NSUserDefaults standardUserDefaults]synchronize];

要读取NSUserDefaults中存储的值,您可以执行以下操作:
NSString *highLevel = [[NSUserDefaults standardUserDefaults] stringForKey:@"levelReached"];

您可以随时将新数据写入NSUserDefaults。因此,如果玩家刚完成一个关卡,请将其写入NSUserDefaults。

@sangony,你会在场景之间使用NSNotification来让关卡场景知道已经到达了新的关卡吗?(仅适用于我的关卡系统) - Liam Stockhomme
这真的取决于你如何设置游戏逻辑。通常我会在关卡结束时,玩家到达出口或完成其他标志性目标后进行处理,表示关卡已完成。我猜你可以使用NSNotification,但在我看来,那样会比你实际需要的更加复杂化你的代码。但再次强调,这完全取决于你自己的代码。 - sangony
没错,不想把它复杂化。谢谢@sangony,我会试着调整一下。 - Liam Stockhomme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接