按下主页按钮时无法暂停游戏场景

Unable to pause Game Scene when home button pressed

我希望我的 SKScene 在按下主屏幕按钮或游戏中断时暂停。

在我的 AppDelegate.swift 文件中,我发送了一个 NSNotification

func applicationWillResignActive(_ application: UIApplication) {
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "pause"), object: nil)
}

func applicationDidEnterBackground(_ application: UIApplication) {
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "pause"), object: nil)
}

GameScene.swift 中,我有以下代码将在 sceneDidLoad() 中提取 NSNotification

NotificationCenter.default.addObserver(self, selector: #selector(GameScene.paused), name: NSNotification.Name(rawValue: "pause"), object: nil)

这会导致调用此函数。

@objc func paused() {
    print("test")
    self.isPaused = true
}

当我在游戏过程中按下主页按钮时,"test" 会打印到控制台,但场景不会暂停。

我可能会在 update() 函数中手动暂停所有精灵。但是,如果有一种方法可以暂停场景本身,我会更喜欢它,因为它不需要存储所有精灵的速度,以便它们可以在游戏未暂停时以相同的速度和方向移动,从而节省时间并使其更容易添加新精灵。

我注意到了与我类似的问题,不幸的是他们没有回答我的问题。

This问题来自和我有同样问题的人,不幸的是,SpriteKit在游戏中断时自动暂停游戏的答案似乎不再正确,我的精灵仍然会移动游戏在后台。

此外,的答案对我不起作用,因为它们不会暂停游戏将每个精灵的速度设置为dx0dy,在我的情况下两者都是必需的。

您可以像这样为 UIApplication.willResignActiveNotification 设置观察者,而无需使用您的自定义通知:

let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.willResignActiveNotification, object: nil)

@objc func appMovedToBackground {
    // You will need to pause the game here, save state etc.
    // e.g. set SKView.isPaused = true
}
来自 Apple 的

This page 包含更多信息。它指出 SKView.isPaused 应在将应用程序发送到后台时自动设置。

考虑一点。如果节点的移动是基于相对于绝对时间点的计时器,这将具有更新位置的效果,就好像它们在后台移动一样。

最后,你是在 SKScene 上给 isPaused 打电话吗?