Как да поставите на пауза SKScene от SKView или 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 - същият ефект, промените на свойствата са "на пауза", но всъщност играта продължава.


person Andrey Derbenev    schedule 05.02.2015    source източник
comment
Проверихте ли, че pauseGameScene всъщност се извиква?   -  person Millie Smith    schedule 05.02.2015
comment
@Millie Smith, да, и мога да получа от pauseGameScene текущото състояние на сцената на играта, като текущо ниво, точки на играча и т.н. Изглежда, че изразът game от let game as GameProcessScene е копие на обект на сцена, но не и препратка.   -  person Andrey Derbenev    schedule 06.02.2015


Отговори (2)


Реших проблема си, като създадох свойство, наречено 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")
    }
}
person rakeshbs    schedule 06.02.2015

Опитахте ли да поставите кода си в

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

Този метод се извиква, преди вашият изглед да се появи всеки път. ViewDidLoad() се изпълнява само веднъж, след като вашето копие е инициализирано.

person szpetip    schedule 05.02.2015
comment
Това не би трябвало да има значение. - person NobodyNada; 05.02.2015