2014年8月5日火曜日

cocos2d-x v3系で通知するにはEventDispatcherを使う

cocos2d-x v3系に搭載されている通知処理を試してみました。
以前(v2系?)までは NotificationCenterというクラスで通知をしていたみたいですね。

v3系ではそれが Deprecated になって、新しくEventDispatcher を使うことが推奨されています。
Notification(通知)から、Event(イベント)と名前が変わっているので混乱するかもしれませんが、内容的には同じだと思います。

テスト環境
  • Mac OS X 10.8.5
  • cocos2d-x v3.2 rc0
  • Android NDK r9d


カスタムイベント(通知)を送る方法

以下の例は、"My Event"というカスタムイベントを送る方法です。
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("My Event");

カスタムイベント(通知)を受け取る方法1

通知を受け取るメソッドを、その場で記述するタイプです。
もっとも使われるパターンかもしれません。
Director::getInstance()->getEventDispatcher()->addCustomEventListener("My Event",[=](cocos2d::EventCustom *event) {
  CCLOG("イベント受け取ったよ > %s",event->getEventName().c_str());
});

カスタムイベント(通知)を受け取る方法2

クラスのインスタンスメソッドを登録するパターンです。
std::bindの使い方を、この際覚えてしまいましょう。(std::bind - C++入門)
Director::getInstance()->getEventDispatcher()->addCustomEventListener("My Event",std::bind(&MyClass::eventHandler,this,std::placeholders::_1));

// イベントを受け取るメソッド定義
void MyClass::eventHandler(cocos2d::EventCustom *event)
{
  CCLOG("イベント受け取ったよ > %s",event->getEventName().c_str());
}

カスタムイベント(通知)を受け取る方法3

クラスメソッドでもstaticなメソッドを登録するパターンです。
Director::getInstance()->getEventDispatcher()->addCustomEventListener("My Event",std::bind(&eventHandler2,std::placeholders::_1));

// イベントを受け取るメソッド定義(※ヘッダでstaticで宣言されている)
// ヘッダ側の宣言: static void eventHandler2(cocos2d::EventCustom *event);
void MyClass::eventHandler2(cocos2d::EventCustom *event)
{
  CCLOG("イベント受け取ったよ > %s",event->getEventName().c_str());
}

カスタムイベント(通知)の受け取りをやめる方法1

以下の例では、addCustomEventListener()で、イベント名を "My Event"に設定したものを全て削除します。
Director::getInstance()->getEventDispatcher()->removeCustomEventListeners("My Event");

カスタムイベント(通知)の受け取りをやめる方法2

addCustomEventListener()のリターン値を退避しておき、それを指定して削除する方法です。(2014/10/8 ※以下ののサンプルコードが間違っていたので修正しました)
auto listener = Director::getInstance()->getEventDispatcher()->addCustomEventListener("My Event",std::bind(&MyClass::eventHandler,this,std::placeholders::_1));

Director::getInstance()->getEventDispatcher()->removeEventListener(listener);

カスタムイベント(通知)の受け取りをやめる方法3

めんどうくさがり屋さんの方法です。
他にどんな通知が登録されているのか知らないで全削除するのはもっての外。
使わないのが懸命かと思われます。
Director::getInstance()->getEventDispatcher()->removeAllEventListeners();

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...