什么是处理多个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游戏模板的默认状态),并有多个场景。
所以你将有LandingScene
和LandingScene
, GameScene
和其他一些场景,比如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
),以确保所有场景都被正确释放。