きょこみのーと

技術に関係ないほうのブログ

Cocos2d-xでのバックグラウンド復帰時の制御について

今回やりたいことは、以下です。

バックグラウンド復帰時にattachされてる特定のノードに何かしたい

ググってると引っかかるのは「AppDelegate.cpp」でSceneの何らかのメソッドを呼ぶみたいな感じです。

もうちょっとスマートにやりたいなーと思って色々調べたのでメモを残します。

環境

  • Cocos2d-x3.0rc0 Cocos2d-x3.0rc

※2014/03/16追記 以前間違って?リリースされたのが3.0rcで2014/03/16に3.0rc0がリリースされましたので修正

やりかたその1(AppDelegateから呼ぶ)

よく目にする手法です。

AppDelegate.cppで以下に復帰時とバックグラウンドに行くときにやりたいことを処理実装する。

  • applicationDidEnterBackground (バックグラウンド遷移時)
  • applicationWillEnterForeground (バックグラウンドから復帰時)

結果

ホームボタンでバッググラウンドに遷移して戻ってくると。

f:id:kyokomi:20140315182910p:plain

ちゃんとポップアップでましたね。

これはこれでいいんですが、 他のSceneとかも同じように実装するか共通クラスみたいなのをつくって、 あれこれしないといけないというデメリットがあります。

もし、このSceneが別のScene上の子要素とかになったときは、さらに面倒な気がします。

(あまりやらない?)

やりかたその2(EventDispatcherで呼ぶ)

さっきの「その1」で書いたコードは全部消しました。

AppMacros.hは特にこだわりはなく何か共通のヘッダーならなんでもいいです。

結果

f:id:kyokomi:20140315183058p:plain

しっかりイベントを受け取ってますね。

もちろん、バックグラウンドも同様にイベント定義して発行すればいけます。

その2の方が何が嬉しいのか

まず、その2の方がクラス間の依存がなくてスッキリしてることがわかります。

AppDelegate.cppはRogueScene.cppの存在を知らずにイベントを発行するだけで特定のメソッドが実装されているとか気にしなくてすみます。

あと、先ほどはScene要素でやりましたが、実は子要素にEventListenerを設定することができます。

ちなみにこんなかんじです。

これをすることで何が嬉しいかというと、以前のエントリーCocos2d-x3.0以降のEventDispatcher制御について(その2)完で話したTouchEventの呼ばれる順番と同じことが適用されます。

つまり、バックグラウンドから復帰時に行いたい処理をZindex順に行ったりプライオリティを指定して個別のクラスでお互いを意識しないで実装できます。

復帰時用メソッドみたいなのをつくってだらだら順番にコードを書く必要無くなりますね。