处理多个 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 游戏模板的默认状态)并具有多个场景。
因此您将有 GameViewController
和 LandingScene
、GameScene
以及可能的其他一些场景,例如 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)方法,以确保正确释放所有场景。
我使用默认的新游戏项目制作了一个游戏,然后插入了一个正常的 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 游戏模板的默认状态)并具有多个场景。
因此您将有 GameViewController
和 LandingScene
、GameScene
以及可能的其他一些场景,例如 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)方法,以确保正确释放所有场景。