代码之家  ›  专栏  ›  技术社区  ›  Andrey Derbenev

如何从SKView或ViewController暂停SKScene

  •  1
  • Andrey Derbenev  · 技术社区  · 10 年前

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

    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类——同样的效果,“暂停”属性更改,但实际上游戏仍在继续。

    2 回复  |  直到 10 年前
        1
  •  1
  •   rakeshbs    10 年前

    我通过创建一个名为 isPaused 并覆盖 paused 属性始终遵循 已暂停 所有物 注意:这将禁止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")
        }
    }
    
        2
  •  0
  •   szpetip    10 年前

    你试过把你的代码

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

    此方法在视图每次出现之前调用。viewDidLoad()仅在实例初始化后运行一次。