Cocos2d-xで、オブジェクトAが違うオブジェクトBに指令を送ってBのメソッドを実行する方法(v3系)です。
それにはEventDispatcherクラスのEventListenerCustomを使います。
UnityのSendMessage的な機能と言っていいと思います。
v3から頻繁に使うようになったEventDispatcherは単にOntouchBeganとかだけに使うと思ってましたが、それどころかもっと便利で深いもののようです。(v2からの移行時に面倒だなと思っていましたが今では汎用性があって良いなと思うようになりました。)
私はC++に造詣が深くないので、これをメッセージングと呼んでよいのか、純粋オブジェクト志向的には変かもしれないといった疑念がありますが、便利なことは確かですね。
イメージ
発信者のオブジェクト(Node , Layer , Spriteなど)
から
受信者のオブジェクト(Node , Layer , Spriteなど)
へ
あらかじめイベントを登録しておく(=リスナーを付与しておく)イメージです。
送信側コード
「voice」は送信者の声、「myEventName」は待ち受けチャンネルのチューニング(ラジオの周波数的な)だと思ってみました。
//イベント発信側
auto event = EventCustom("myEventName");
auto voice = Value("聞こえますかー?");
event.setUserData(&voice);
getEventDispatcher()->dispatchEvent(&event);
受信側コード
リスナーなので、チューニングを合わせて「voice」を聞くイメージ、と思ってみました。
//イベント受信側
auto reciever = EventListenerCustom::create("myEventName",[this](EventCustom* event)
{
auto voice = (Value*)event->getUserData();
log("「%s」", voice->asString().c_str());
});
getEventDispatcher()->addEventListenerWithFixedPriority(reciever, 1);
発揮されるCocos2d-x、v3系の良さ
リスナーと、ラムダ式。これだけでもv3系の良さを享受できましたね。
※※つかわなくなったリスナーは外そう※※
このような形でつかわなくなったカスタムリスナーは必ずはずしましょう。
同じ名前でイベントがかぶっている時のエラーがなかなか気づかないので凶悪です。(体験談)
Director::getInstance()->getEventDispatcher()->removeCustomEventListeners("someEvent");