【问题标题】:Segue from SKScene and back again cause game to "freeze"从 SKScene 转回并再次导致游戏“冻结”
【发布时间】:2019-02-14 03:20:18
【问题描述】:

我正在开发具有两个不同场景(MainMenu.sks 和 Settings.sks)的 SpriteKit 游戏。我也有一个 UIViewController。

用户可以从 MainMenu 点按“设置”,这会导致应用加载 Settings.sks 场景并呈现它。

使用以下代码完成:

// Move to Settings.sks
            let transition = SKTransition.flipVertical(withDuration: 1.0)
            let loadScene = SettingsScene(fileNamed: "SettingsScene")
            loadScene?.scaleMode = self.scaleMode
            self.view?.presentScene(loadScene!, transition: transition)

在 Settings.sks 场景中,用户可以点击 SKLabelNode “更改用户名”,这会导致应用程序通过执行 segue 来加载 UIViewController。

UIViewController 包含一个 UITextField 和一个 UIButton。 UIButton 将用户带回 MainMenu.sks。

但是,当我这样做时,它就像 MainMenu 的新场景被放置在另一个场景上,导致应用程序“冻结”并且不响应任何触摸手势。我可以从 nodeCount 中看到节点增加了一倍。

一种解决方法是直接从 MainMenu.sks 加载 UIViewController(也通过 segue)。这样,应用程序就可以正常工作了。

我怀疑问题出在我加载 Settings.sks 的方式上。

我错过了什么?也许在退出之前卸载整个 SKView?

【问题讨论】:

  • 从它的声音来看,我认为您可能对 UIViewController 顶部呈现的新 MainMenu 是正确的。你能从 UIViewController 发布代码,将你带到 MainMenu 吗?
  • 发生过渡时,两个场景都将存在。 IIRC 的工作原理是旧场景成为“幕后”新场景的子节点,以允许对两者进行更新。我要做的第一件事是在没有过渡的情况下让一切正常工作,并确保您的场景没有任何保留周期导致它们保持活力。
  • @guardworkingelsepanic - 我也怀疑。我的代码只是一个简单的转场:// Exit view self.performSegue(withIdentifier: "saveAndReturnToGame", sender: self)

标签: swift sprite-kit segue


【解决方案1】:

执行 segue 将在堆栈顶部呈现一个新视图。通过使用 segue 返回主菜单,应用程序将在 UIViewController 之上创建一个新的主菜单。我不能确定为什么您的应用程序会冻结。但我猜想当从 UIViewController 创建和呈现新的主菜单时,有些属性或功能无法正常工作。

我建议改为展开用于到达 UIViewController 的 segue。这样您就可以返回上一个视图并节省内存。

您需要在目标视图中编写 IBAction,在本例中为主菜单:

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
}

然后从 UIViewController 中的按钮按住 ctrl 并拖动到情节提要中的退出图标。您应该会看到一个使用您刚刚编写的 IBAction unwindToMainMenu 的选项。这将创建一个 unwind segue。

可以在此答案中找到展开 segues 的完整指南和多个示例:What are Unwind segues for and how do you use them?

【讨论】:

  • 这正是我要找的!随着segue展开,它就像一个魅力。不敢相信我没有偶然发现这一点。非常感谢。
猜你喜欢
  • 2018-03-30
  • 2013-12-15
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多