我使用默认的新游戏项目制作了一个游戏,然后插入了一个普通的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可以完成游戏逻辑,如下一轮游戏等。 任何帮助或指示将不胜感激,因为我想这样做!
答案 0 :(得分:7)
拥有单视图控制器和多个场景
您可以使用单视图控制器(实际上是SpriteKit游戏模板的默认状态)并具有多个场景。
因此,您将拥有GameViewController
和LandingScene
,GameScene
以及其他一些场景,例如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)方法,以确保所有场景都被正确释放。