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

我使用默认的新游戏项目做了一个游戏,然后插入一个普通的UIView作为应用程序的介绍场景。 因为使用SKScene将intro“升级”了起来,使用button将原始的gameViewController放到堆栈上。 一旦游戏视图被加载,似乎有点迟缓,所以我假设这是与2完整的skscenes和视图控制器的开销。 我甚至设置了着陆场景暂停,但显然仍然使用内存!

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

当前设置:

LandingViewController |-LandingScene GameViewController |- GameViewScene |- Other Game Classes 

应用程序进入LandingScene(和着陆UI精灵)的LandingViewController。 LandingViewController处理触摸事件,如button等。当新游戏被轻敲时,GameViewController被推送(当前使用Segue)和GameViewController进入场景,游戏状态,UI,游戏板等。GameViewController处理触摸事件的场景。 当游戏结束时(点击结束游戏或游戏结束状态),GameViewControllerpopup。

LandingViewController和GameViewController控制他们的animation和点击stream等,所以GameViewController做游戏逻辑,像下一个转弯结束游戏等任何帮助或指针将不胜感激,因为我想这样做的权利!

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

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

所以你会有LandingSceneLandingSceneGameScene和其他一些场景,比如LevelSelect场景或类似的东西。

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

所以,从这个angular度来说,您可以使用SKView's presentScene:方法(也可以使用SKTransition类)从任何场景转换。

转变

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

1.有人可能会告诉你,从当前场景转换到下一个场景是一个“糟糕的devise”,当前场景应该通知视图控制器它的准备过渡状态,以便视图控制器可以使需要过渡。 但是为了回应这些,这些是来自文档的引用:

两个场景之间的过渡

通常情况下,您会根据游戏玩法或用户input转换到新的场景。 例如, 如果用户在主菜单场景中按下button,则可能转换到新的场景来configuration玩家想要玩的比赛。

和相关的代码:

 - (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.使用上述使用委托模式的方法,场景委托过渡到视图控制器的责任。

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

暗示:

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