[英]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:也嘗試過UIApplicationWillResignActiveNotification
, UIApplicationDidEnterBackgroundNotification
但game.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.