处理多个SKScenes的最佳方法是什么?

时间:2016-02-15 08:20:53

标签: ios sprite-kit skscene

我使用默认的新游戏项目制作了一个游戏,然后插入了一个普通的UIView作为app intro场景。我自从'升级'介绍到使用SKScene,其中的按钮将原始的gameViewController推入堆栈。一旦加载了游戏视图,它似乎有点滞后,所以我假设这与2个完整的skscenes和视图控制器的开销有关。我甚至将着陆场景设置为暂停,但它显然仍会使用内存!

我的问题是,我如何使用SKScene作为登陆页面(使用它自己的LandingViewController),然后有效地将GameViewController添加到堆栈中。我试过合并2个视图控制器,但这似乎是一种愚蠢的做事方式。

当前设置:

LandingViewController
|-LandingScene

GameViewController
|- GameViewScene
|- Other Game Classes

应用程序进入LandingViewController,它进入LandingScene(并登陆UI Sprites)。 LandingViewController处理触摸事件,如按钮等。当点击新游戏时,推动GameViewController(目前使用Segue)和GameViewController进入它的场景,游戏状态,UI,游戏板等.GameViewController处理它的场景触摸事件。当游戏结束时(点击结束游戏或游戏结束状态),将弹出GameViewController。

LandingViewController和GameViewController控制着他们的动画和点击等流程,因此GameViewController可以完成游戏逻辑,如下一轮游戏等。 任何帮助或指示将不胜感激,因为我想这样做!

1 个答案:

答案 0 :(得分:7)

拥有单视图控制器和多个场景

您可以使用单视图控制器(实际上是SpriteKit游戏模板的默认状态)并具有多个场景。

因此,您将拥有GameViewControllerLandingSceneGameScene以及其他一些场景,例如LevelSelect场景或类似场景。

GameViewController中,您首次初始化场景。因此,您可以初始化LandingScene(我想这是您实施导航菜单的地方)。

因此,从那时起,您可以使用SKView's presentScene:方法(以及可选地使用SKTransition类)从您想要的任何场景进行转换。

<强>转换

SpriteKit中的转换通常可以通过两种不同的方式完成:

1。有些人可能会告诉你,从当前场景转换到下一个场景是一个糟糕的设计&#34;并且当前场景应该通知视图控制器其准备转换状态,以便视图控制器可以进行所需的转换。但作为对此的回应,这些是来自文档的引用:

  

在两个场景之间转换

     

通常,您会根据游戏玩法或用户转换到新场景   输入。例如,如果用户按下主菜单中的按钮   场景,您可以转换到新场景来配置匹配   球员想要比赛。

相关代码:

- (void)mouseUp:(NSEvent *)theEvent
{
    [self runAction: self.buttonPressAnimation];
    SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
    GameConfigScene *newScene = [[GameConfigScene alloc] initWithSize: CGSizeMake(1024,768)]];
    [self.scene.view presentScene: newScene transition: reveal];
}

可以清楚地看到,转换到下一个场景是在当前场景中完成的。

2. 使用委托模式使用上述方法,其中scene委托过渡到视图控制器的责任。

两种方式都很完美,第一种方法是IMO有点方便,并且被广泛使用。因此,您可以轻松地在SpriteKit中的不同场景之间进行导航。

<强>提示:

在开发阶段,不要忘记覆盖场景的dealloc(或deinit,如果你使用Swift)方法,以确保所有场景都被正确释放。