Spritekit - 在 didBecomeActive 时保持游戏暂停

Posted

技术标签:

【中文标题】Spritekit - 在 didBecomeActive 时保持游戏暂停【英文标题】:Spritekit - Keep the game paused when didBecomeActive 【发布时间】:2016-01-15 17:36:34 【问题描述】:

我有一个带有一个功能和一个按钮的暂停系统,它运行良好,我知道当应用程序进入后台时它会自动暂停,当它回来时它会自动取消暂停,我的问题是我不知道如何当它再次变为活动状态时保持暂​​停。

func applicationWillResignActive(application: UIApplication) 

    NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil) // tried here
        


func applicationDidBecomeActive(application: UIApplication) 

    NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil) // tried here

我分别尝试了这两种方法,但游戏继续运行,有时它会显示我的暂停菜单(游戏上方的一层)并且仍然在后台运行。那么实现这一目标的正确方法是什么?

【问题讨论】:

【参考方案1】:

在您的场景或视图中,您应该能够通过添加观察者来处理暂停

    NSNotificationCenter.defaultCenter().addObserver(self,selector:Selector("pauseGame:",name:"Pause",object:nil)

然后你添加一个函数来处理这个

func pauseGame(notification:NSNotification)

    self.paused = true;

现在请记住,我发现在 ios 8 中存在一个错误,即 CBApplicationDidBecomeActive 会导致不良结果,因此您需要在 SKView 的类中重写它,如下所示:

class GameSceneView : SKView

    ...//Other Code
    func CBApplicationDidBecomeActive()
    
    

【讨论】:

当然我有一个观察者来对应通知,但是那个函数是什么,它怎么会覆盖 AppDelegate 中的那个?! Appdelegate 作为通知,当确实激活时自动发送被调用,所以 skview 在幕后调用该函数,并弄乱了暂停,基本上你正在做的是覆盖它,以便它在内部方法没有被调用 我说的是 CBDidBecomeActive 并没有覆盖 AppDelegate 中的函数,它是一个自定义的无关函数。 不进入 AppDelegate 进入到定义在 SKView 中的类,是 SKview 内部的私有函数,加上这是一种欺骗系统的方法 它不会覆盖 AppDelegate 中的函数调用,iOS 中有已经触发的通知,因此您不需要添加另一个名为 UIApplicationDidBecomeActiveNotification 的通知。这反过来又会触发 apdelegate 的 did become active 方法。 SKView 也有这个通知的监听器,当它命中时 SKView 会调用方法 CBApplicationDidBecomeActive。现在在 iOS 8 中,有一个错误会导致它重置暂停状态。因此,如果您将该方法放入您的自定义 SKView,它将不会被调用

以上是关于Spritekit - 在 didBecomeActive 时保持游戏暂停的主要内容,如果未能解决你的问题,请参考以下文章

将scenekit和spritekit组合在一个屏幕中

SpriteKit 暂停和恢复 SKView

如何在 SpriteKit 中创建图像节点?斯威夫特 4

如何在 Swift 和 SpriteKit 中添加涟漪效果

SpriteKit:在场景之间传递数据

在 SpriteKit 中生成随机地形