如何从SKView或ViewController暂停SKScene

时间:2015-02-05 17:25:47

标签: ios swift uiviewcontroller sprite-kit skscene

我有以下代码暂停游戏场景:

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:还尝试了UIApplicationWillResignActiveNotificationUIApplicationDidEnterBackgroundNotification,但game.onPause = true仍然无效。它将“SKScene.paused”属性更改为true,但当游戏进入前景时,操作仍在执行,即使游戏场景在进入后台之前暂停。

UPD2:我将ViewController类中的观察者和选择器移动到GameProcessScene:SKScene类 - 相同的效果,“暂停”属性更改,但事实上游戏仍在继续。

2 个答案:

答案 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()只运行一次。

相关问题