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

What's the best way to handle multiple SKScenes?

我使用默认的新游戏项目制作了一个游戏,然后插入了一个正常的 UIView 作为应用介绍场景。我从 'upgraded' 开始使用 SKScene,使用将原始 gameViewController 推入堆栈的按钮。加载游戏视图后似乎有点滞后,所以我假设这与拥有 2 个完整的 skscenes 和视图控制器的开销有关。我连登陆场景都设置暂停了,但是明明还是会占内存!

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

当前设置:

LandingViewController
|-LandingScene

GameViewController
|- GameViewScene
|- Other Game Classes

应用程序进入初始化 LandingScene 的 LandingViewController(并着陆 UI Sprites)。 LandingViewController 处理按钮等触摸事件。当点击新游戏时,GameViewController 被推送(当前使用 Segue)并且 GameViewController 初始化它的场景、游戏状态、UI、游戏板等。GameViewController 处理它的场景触摸事件.当游戏结束时(点击结束游戏或游戏结束状态)GameViewController 弹出。

LandingViewController 和 GameViewController 都控制它们的动画和点击等流程,因此 GameViewController 执行游戏逻辑,例如下一回合结束游戏等。 任何帮助或指点将不胜感激,因为我想正确地做到这一点!

有一个视图控制器和多个场景

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

因此您将有 GameViewControllerLandingSceneGameScene 以及可能的其他一些场景,例如 LevelSelect 场景或类似的东西。

GameViewController中,您第一次初始化了场景。所以这就是你初始化 LandingScene 的地方(我想那是你实现导航菜单的地方)。

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

过渡

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

1. 有些人可能会告诉您从当前场景过渡到下一个场景是 "bad design" 并且当前场景应该通知视图控制器了解其准备转换状态,以便视图控制器可以进行所需的转换。但作为对此的回应,这些是来自文档的引述:

Transitioning Between Two Scenes

Typically, you transition to a new scene based on gameplay or user input. For example, if the user presses a button in your main menu scene, you might transition to a new scene to configure the match the player wants to play.

及相关代码:

- (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. 使用上述使用委托模式的方法,其中场景将转换的责任委托给视图控制器。

这两种方法都很好,第一种方法在我看来有点方便,并且被广泛使用。这就是您如何轻松地在 SpriteKit 中的不同场景之间导航。

提示:

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