SpriteKit - didBecomeActive 时不显示暂停屏幕

Posted

技术标签:

【中文标题】SpriteKit - didBecomeActive 时不显示暂停屏幕【英文标题】:SpriteKit - Pause screen doesn't show when didBecomeActive 【发布时间】:2016-01-24 11:01:00 【问题描述】:

我的暂停系统可以在游戏内部完美运行,而且当应用程序移至后台然后再次激活时,游戏会保持暂停状态,但我现在的问题是当它激活时我的暂停屏幕不显示。

AppDelegate:

func applicationDidBecomeActive(application: UIApplication) 

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


视图控制器:

override func viewDidLoad() 
        super.viewDidLoad()

        let scene  = GameScene()
        // Configure the view.
        let skView =  self.view as! MainView

        NSNotificationCenter.defaultCenter().addObserver(skView, selector: "setStayPaused", name: "Pause", object: nil)

        skView.ignoresSiblingOrder = true
        scene.scaleMode = .AspectFill
        scene.size = skView.bounds.size

        skView.presentScene(scene)
    

MainView(我的自定义skView):

class MainView: SKView 

    var stayPaused = false as Bool

    override var paused: Bool 
        get 
            return super.paused
        
        set 
            if (!stayPaused) 
                super.paused = newValue
            
            stayPaused = false
        
    

    func setStayPaused() 
        if (super.paused) 
            self.stayPaused = true
        
    

游戏场景:

  override func didMoveToView(view: SKView) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGame", name: "Pause", object: nil)


func pauseGame() 

        if isFirstTime == false  // to make sure that the app did not just get launched

            pauseScreen.hidden = false // doesn't show
            pauseButton.hidden = false // doesn't show
            view?.paused = true
            scene?.paused = true
        

【问题讨论】:

【参考方案1】:

设置暂停屏幕和按钮的隐藏属性无效,因为视图和/或场景已暂停。您需要暂时取消暂停视图,将隐藏属性设置为 false,返回主循环,然后重新暂停视图。这是一个如何做到这一点的示例。

AppDelegate:

func applicationWillResignActive(application: UIApplication)         
    NSNotificationCenter.defaultCenter().postNotificationName("PauseViewNotification", object:nil)


func applicationDidBecomeActive(application: UIApplication) 
    NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseScreenNotification", object:nil)

MainVew(SKView 子类):

class MainView: SKView 
    override var paused: Bool 
        get 
            return super.paused
        
        set 

        
    

    func pause() 
        super.paused = true
    

    func resume() 
        super.paused = false
    

    func togglePause() 
        super.paused = !super.paused
    

视图控制器:

override func viewDidLoad() 
    super.viewDidLoad()

    if let scene = GameScene(fileNamed:"GameScene") 

        // Configure the view.
        let skView = self.view as! MainView

        NSNotificationCenter.defaultCenter().addObserver(skView, selector:Selector("pause"), name: "PauseViewNotification", object: nil)
    

游戏场景:

override func didMoveToView(view: SKView) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("pauseGame"), name: "ShowPauseScreenNotification", object: nil)


func pauseGame() 
    if (!isFirstTime) 
        pauseScreen.hidden = false
        pauseButton.hidden = false
        // Un-pause the view so the screen and button appear
        if let customView = self.view as? MainView 
            customView.resume()
        
        // Re-pause the view after returning to the main loop
        let pauseAction = SKAction.runBlock(
            [weak self] in
            if let customView = self?.view as? MainView 
                customView.pause()
            
        )
        runAction(pauseAction)
    
    isFirstTime = false

您可以在暂停状态之间切换

if let customView = self.view as? MyView 
    customView.togglePause()

【讨论】:

以上是关于SpriteKit - didBecomeActive 时不显示暂停屏幕的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit - 屏幕坐标的底部

SpriteKit - 暂停输入

SpriteKit 暂停和恢复 SKView

CAShapeLayer 和 SpriteKit

SpriteKit - 生成随机节点

SpriteKit 丢失纹理