暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?

Posted

技术标签:

【中文标题】暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?【英文标题】:Pausing a SpriteKit Game - UIApplicationWillResignActive vs. UIApplicationDidBecomeActive? 【发布时间】:2017-06-30 20:44:38 【问题描述】:

我了解这两种方法之间的区别,但我想知道在执行诸如暂停 SpriteKit 游戏之类的操作时,使用 UIApplicationWillResignActive 与 UIApplicationDidBecomeActive(或 UIApplicationDidEnterBackground)相比是否有缺点。我一直在浏览网站上的线程,并注意到通常在回答询问如何暂停 SpriteKit 游戏的问题时,建议使用 UIApplicationDidBecomeActive 和 UIApplicationDidEnterBackground,而不是 UIApplicationWillResignActive。由于 UIApplicationWillResignActive 也会暂停游戏以响应 Siri/Calls,在处理暂停 SpriteKit 游戏等时,这不是更好的方法吗?或者使用它有什么缺点吗?

下面我有我的通知和暂停功能:

NotificationCenter.default.addObserver(self, selector: #selector(self.pauseGame), name:NSNotification.Name.UIApplicationDidBecomeActive, object: nil)

//OR

NotificationCenter.default.addObserver(self, selector: #selector(self.pauseGame), name:NSNotification.Name.UIApplicationWillResignActive, object: nil)

暂停功能:

func pauseGame()
    print(self.scene?.isPaused)
    if sceneIsPaused == true || isGameOver == true
        return
    

    leftMobGenTimer.invalidate()
    rightMobGenTimer.invalidate()
    genDragonTimer.invalidate()
    checkNinjaTimer.invalidate()

    chiStrikeTimer.invalidate()
    randCoinTimer.invalidate()

    print("Timer stopped?")

    if soundEnabled == true
     player.pause()
    

    self.scene?.isPaused = true
    sceneIsPaused = true
    makePauseView()


【问题讨论】:

【参考方案1】:

暂停

这是来自关于applicationWillResignActive 方法的文档:

您应该使用此方法来暂停正在进行的任务、禁用计时器以及 降低 OpenGL ES 帧速率。游戏应该使用这种方法来 暂停游戏。处于非活动状态的应用程序应该做最少的工作 在它等待转换到活动或后台状态时。

所以这个方法是用来暂停游戏的。

取消暂停

iirc,当应用程序从非活动状态转换为活动状态时,游戏应自动取消暂停。这是调用applicationDidBecomeActive 方法的时刻,因此在某些情况下,您可能还想在此处暂停游戏……但这取决于您的游戏。

我不知道你为什么提到 applicationDidBecomeActiveapplicationDidEnterBackground 的组合用于暂停/取消暂停...因为在 applicationDidEnterBackground 暂停游戏可能为时已晚,而且从技术上讲,它不需要取消暂停applicationDidBecomeActive 中的游戏,因为这是自动完成的。

【讨论】:

感谢您的链接和解释!绝对为我清除了它,applicationDidEnterBackground 延迟解释实际上帮助我解决了我在另一个应用程序中处理的另一个问题。再次感谢!

以上是关于暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit - 在 didBecomeActive 时保持游戏暂停

SpriteKit 和 SceneKit – 如何完全暂停游戏?

在 spritekit 中暂停游戏时显示菜单

暂停和重置游戏 Spritekit / Swift 之间的区别?

使用物理 SKSpriteNode 子级暂停 SpriteKit 游戏

在 SpriteKit 中暂停游戏后文本消失