【问题标题】:What's the best way to handle multiple SKScenes?处理多个 SKScene 的最佳方法是什么?
【发布时间】:2016-05-26 01:45:28
【问题描述】:

我使用默认的新游戏项目制作了一个游戏,然后插入了一个普通的 UIView 作为应用介绍场景。我已经“升级”了使用 SKScene 的介绍,并带有将原始 gameViewController 推入堆栈的按钮。一旦加载了游戏视图,它似乎有点滞后,所以我假设这与拥有 2 个完整的场景和视图控制器的开销有关。我什至将着陆场景设置为暂停,但它显然仍然会占用内存!

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

当前设置:

LandingViewController
|-LandingScene

GameViewController
|- GameViewScene
|- Other Game Classes

App 进入 LandingViewController,它初始化 LandingScene(和登陆 UI Sprites)。 LandingViewController 处理按钮等触摸事件。当点击新游戏时,GameViewController 被推送(当前使用 Segue)并且 GameViewController 初始化它的场景、游戏状态、UI、游戏板等。GameViewController 处理它的场景的触摸事件。当游戏结束(点击结束游戏或游戏结束状态)时,GameViewController 会弹出。

LandingViewController 和 GameViewController 都控制着它们的动画和点击等的流程,所以 GameViewController 负责游戏逻辑,比如下一回合结束游戏等。 任何帮助或指示将不胜感激,因为我想这样做!

【问题讨论】:

  • 嗯,你能具体说明什么落后于你吗?除非您不断释放和更新资源,否则使用大量内存不会导致延迟,因此您可能会发生一些您不知道的事情。
  • 我在 GameScene 上移动的精灵的反应和动画速度较慢。这只是在我有两个场景视图后才开始。我不会根据@Whirlwind 的建议修改函数

标签: ios sprite-kit skscene


【解决方案1】:

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

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

因此您将拥有GameViewControllerLandingSceneGameScene 以及可能的其他一些场景,例如LevelSelect 场景或类似的场景。

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

因此,从那时起,您可以使用 SKView's presentScene: 方法(以及可选地使用 SKTransition 类)从任何您想要的场景进行过渡。

过渡

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

1. 有些人可能会告诉您,从当前场景过渡到下一个场景是一种“糟糕的设计”,并且当前场景应该通知视图控制器其准备就绪-transition 状态,以便视图控制器可以进行所需的转换。但作为回应,这些是来自文档的引用:

两个场景之间的过渡

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

及相关代码:

- (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(或 deinit,如果您使用 Swift)方法,以确保正确释放所有场景。

【讨论】:

  • 谢谢。我将尝试修改我必须让 UIViewcontroller 负责的内容,然后切换场景。我只需要根据需要将所有功能移动到每个场景中即可。
  • 好的,所以我选择了选项 1,效果很好!太感谢了。我可能最终会移动到 2 并最终使用委托,因为将所有内容都保留在场景中并尽可能少地包含在包含视图控制器中是有意义的
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2010-09-06
  • 2015-02-03
  • 2020-04-17
  • 2018-02-14
  • 2012-09-18
相关资源
最近更新 更多