2015-02-05 89 views
1

我有以下代碼暫停遊戲場景暫停SKScene:如何從SKView或視圖控制器

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,UIApplicationDidEnterBackgroundNotificationgame.onPause = true仍然無法正常工作。它將「SKScene.paused」屬性更改爲true,但當遊戲進入前景時,動作仍然在執行,即使遊戲場景在背景前暫停。

UPD2:我將觀察者和選擇器從ViewController類移到GameProcessScene:SKScene類 - 同樣的效果,「暫停」屬性更改,但實際上游戲玩法正在繼續。

+0

是否已確認pauseGameScene其實是在叫什麼名字? – 2015-02-05 20:57:14

+0

@Millie Smith,是的,我可以從暫停遊戲場景的當前狀態獲得遊戲場景的當前狀態,例如當前級別,玩家點數等等。它看起來像''遊戲',因爲GameProcessScene'語句是場景對象的副本,但是不參考。 – 2015-02-05 21:23:02

回答

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 
     } 
    } 
} 

在視圖控制器

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") 
    } 
} 
+0

謝謝!有用! – 2015-02-06 07:45:09

0

你嘗試把你的代碼放到

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

這種方法之前,你的觀點似乎每次調用。 viewDidLoad()只在您的實例初始化後運行一次。

+0

這應該沒有區別。 – NobodyNada 2015-02-05 19:39:56

+0

謝謝,但它不工作。 – 2015-02-05 19:47:20

相關問題