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

时间:2019-07-17 18:08:27

标签: ios swift scenekit appdelegate skscene

我希望我的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中,我有以下代码将在NSNotification中拾取sceneDidLoad()

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在中断时会自动暂停游戏似乎不再成立,我的精灵仍然会在游戏过程中移动。在后台。

另外,this similar question的答案对我不起作用,因为它们不会暂停游戏,或者将每个精灵的速度设置为dx和{{1 dy中的}},在我的情况下两者都是必需的。

1 个答案:

答案 0 :(得分:1)

您可以这样设置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应该在将应用程序发送到后台时自动设置。

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

最后,您是在isPaused上致电SKScene吗?