簡體   English   中英

如何從SKView或ViewController暫停SKScene

[英]How to pause SKScene from SKView or ViewController

我有以下代碼暫停游戲場景:

class GameProcessScene: SKScene {
...
var onPause: Bool = false {
    willSet {
        self.paused = newValue
        self.view?.paused = newValue
    }
}
...
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch in touches {
        let location = touch.locationInNode(self)
        let possiblePauseNode = self.nodeAtPoint(location)
        if (possiblePauseNode.name == "pauseButton") {
            if (self.paused) {
                onPause = false
            } else {
                onPause = true
            }
            return
        }
    ...
    }
}

按下按鈕即可暫停。 但是我也想在背景出現時暫停游戲。 我正在嘗試從ViewController類執行此操作:

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGameScene", name: UIApplicationWillEnterForegroundNotification, object: nil)
}
func pauseGameScene() {
    let view = self.view as SKView
    let scene = view.scene
    switch scene {
    case is MainMenuScene:
        println("MainMenu")
    case let game as GameProcessScene:
        game.onPause = true
    default:
        println("default")
    }
}
deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

但是當游戲從后台出現時它不起作用。 有人可以幫忙嗎? 謝謝!

UPD1:也嘗試過UIApplicationWillResignActiveNotificationUIApplicationDidEnterBackgroundNotificationgame.onPause = true仍然不起作用。 它將“ SKScene.paused”屬性更改為true,但是當游戲進入前景時,動作仍在執行,即使游戲場景在進入背景之前也已暫停。

UPD2:我將觀察者和選擇器從ViewController類移至GameProcessScene:SKScene類-效果相同,“暫停”屬性發生了變化,但實際上游戲性仍在繼續。

我通過創建一個名為isPaused的屬性並覆蓋已paused屬性以始終遵循isPaused屬性來解決了我的問題。 注意:這將使SKSCene在進入后台模式時不會自動暫停。 您必須手動設置isPaused屬性。 因此,僅在需要恢復的暫停模式的場景中使用它。

class GameScene: SKScene,SKPhysicsContactDelegate {

       // Initializers

    var isPaused : Bool = false {
        didSet {
            self.paused = isPaused
        }
    }
     override var paused : Bool {
        get {
            return isPaused
        }
        set {
            super.paused = isPaused
        }
    }
}

在ViewController中

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGameScene", name: UIApplicationWillResignActiveNotification, object: nil)
}

func pauseGameScene() {
    println("will become inactive")
    let view = self.view as SKView
    let scene = view.scene
    switch scene {
    case let game as GameScene:
        game.isPaused = true
    default:
        println("default")
    }
}

您是否嘗試將代碼放入

override func viewWillAppear(animated: Bool) {
    //Put your pauseGameScene(); code here
} 

每次出現視圖之前都會調用此方法。 實例初始化后,viewDidLoad()僅運行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM