我有以下代码暂停游戏场景:
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类 - 相同的效果,“暂停”属性更改,但事实上游戏仍在继续。
答案 0 :(得分:1)
我通过创建名为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")
}
}
答案 1 :(得分:0)
您是否尝试过将代码放入
override func viewWillAppear(animated: Bool) {
//Put your pauseGameScene(); code here
}
每次在您的视图出现之前调用此方法。初始化实例后,viewDidLoad()只运行一次。