##はじめに
ホームボタンを押した時に処理を止めたいとか、ポーズメニューを表示したい場合があります。
音楽を使ったゲームや連続性のあるゲームでよくあるのではないでしょうか。
##ホームボタン押下時に呼ばれるメソッド
まずホームボタンを押した時(厳密にはアプリを閉じそうな時)に呼ばれるメソッドはAppDelegate.swift内の
applicationWillResignActiveメソッドです。
ちなみに、ホームボタンを2回連続で押した時(メモリ解放の画面になるやつです)や、電話が掛かってきた時もこちらのメソッドが呼ばれます。
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
//アプリを閉じそうな時に呼ばれる
func applicationWillResignActive(application: UIApplication) {
//ポーズの処理を行う
}
}
その中にコードを書けば良いのですが、すでに別のクラスでポーズメニューの処理を書いていたりしたので、NSNotificationCenterクラスを使ってみました。これが結構便利です
NSNotificationCenterクラスは通知という仕組みを使って、あるイベントが発生した時に別クラスでそのイベントを拾うことができます。
##通知の追加
例えばPauseGameSceneという名前の通知をapplicationWillResignActiveメソッド内に作ります。
NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func applicationWillResignActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("PauseGameScene", object: self)
}
}
##オブザーバーの追加
次は別のクラスで通知を受け取る役割を担うオブザーバーというものを追加します。例ではGameViewControllerクラスを使っています。
import SpriteKit
class GameViewController: UIViewController{
var gameScene: GameScene!
override func viewDidLoad() {
//...省略
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pause), name: "PauseGameScene", object: nil)
}
func pause() {
//ここでポーズの処理やポーズメニューを表示
//例えばこんな感じの処理
self.gameScene.view!.paused = true
}
deinit{
//削除
NSNotificationCenter.defaultCenter().removeObserver(self)
}
}
addObserverのselectorには実行したいメソッド名(ここではpause
)、nameには作っておいた通知の名前(ここではPauseGameScene
)を入れます。
後は指定したメソッド内で、ポーズの処理を書くだけです。
最後にdeinit内でオブザーバーを削除した方がいいのかな?