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

Des*_*023 6 ios sprite-kit skscene

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

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

目前的设置:

LandingViewController
|-LandingScene

GameViewController
|- GameViewScene
|- Other Game Classes
Run Code Online (Sandbox Code Playgroud)

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

LandingViewController和GameViewController都控制着他们的动画和点击等流程,因此GameViewController可以完成游戏逻辑,就像下一轮游戏等等.任何帮助或指针都会受到赞赏,因为我想这样做!

Whi*_*ind 7

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

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

所以,你将有GameViewControllerLandingScene,GameScene和可能的其他一些场景,比如LevelSelect场景或类似的东西.

GameViewController,您首次初始化场景.这就是你初始化你LandingScene的地方(我想这是你实现导航菜单的地方).

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

转变

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

1.有些人可能会告诉你,从当前场景转换到下一个场景是一个"糟糕的设计",并且当前场景应该通知视图控制器它的准备转换状态,以便视图控制器可以制作需要转型.但作为回应,这些是来自文档的引用:

在两个场景之间转换

通常,您会根据游戏玩法或用户输入过渡到新场景.例如,如果用户按下主菜单场景中的按钮,则可以转换到新场景以配置玩家想要播放的匹配.

以及相关代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

两种方式都很完美,第一种方法是IMO有点方便,并且被广泛使用.这就是你如何SpriteKit以简单的方式在不同的场景之间导航.

暗示:

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