【cocos2d-x】CC_CALLBACKを使いこなす

c++

cocosではコールバックの実装法は二つあります。

・lambda式
・メソッド呼び出し

個人的にはlambda式の方が好きです。
が、エラー処理を共通化する場合にメソッド呼び出しをする時があります。

関数を指定する際に用いる書式が以下です。

#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

勘の良い方なら気付いたかと思いますが、これらの違いは端的に述べると引数の個数です。

基本的な使い方

// 呼び出される関数
void HelloWorld::hoge() { }
void HelloWorld::fuga(int a) { }
void HelloWorld::foo(int a, int b) { }
void HelloWorld::bar(int a, int b, int c) { }
int HelloWorld::baz(int a, int b, int c) { }

これらは以下の様に表します。

CC_CALLBACK_0(HelloWorld::hoge, this);
CC_CALLBACK_1(HelloWorld::fuga, this);
CC_CALLBACK_2(HelloWorld::foo, this);
CC_CALLBACK_3(HelloWorld::bar, this);
CC_CALLBACK_3(HelloWorld::baz this);

functionに代入する事も可能

もちろんfunctionに代入も可能です。

function<void()> hoge = CC_CALLBACK_0(HelloWorld::hoge, this);
function<int(int, int, int)> baz = CC_CALLBACK_3(HelloWorld::baz this);

ここで二つ疑問が浮かびました。

1. 第二引数のthisってなんだろう・・・。
2. 4つ以上のメソッドを指定したい場合はどうすれば良いんだろう?

誰かのお役に立てば。

コメント

タイトルとURLをコピーしました