来自SKScene的Segue再次返回,导致游戏“冻结”

时间:2019-02-13 16:10:45

标签: swift sprite-kit segue

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

在MainMenu中,用户可以点击“ Settings”,这将导致应用程序加载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(也通过segue)加载UIViewController。这样,该应用程序就可以正常运行。

我怀疑问题是我加载Settings.sks的方式。

我想念什么?也许在退出之前卸载整个SKView?

1 个答案:

答案 0 :(得分:1)

执行segue将在堆栈顶部显示一个新视图。通过使用segue返回主菜单,应用程序将在UIViewController顶部创建一个新的主菜单。我无法确定您的应用为何冻结。但是我猜想当从UIViewController创建并显示一个新的主菜单时,某些属性或功能不能正常工作。

我建议平移用于到达UIViewController的序列。这样,您可以返回上一个视图并节省内存。

您需要在目标视图中写一个IBAction,在这种情况下,是主菜单:

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
}

然后将ctrl从UIViewController中的按钮拖到情节提要中的退出图标。您应该看到一个使用刚刚编写的IBAction unwindToMainMenu的选项。这将创建一个放松的环境。

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