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つ以上のメソッドを指定したい場合はどうすれば良いんだろう?
誰かのお役に立てば。
開発のプロが教える Cocos2d-x逆引きガイドブック
買いました。すごく良いです。
コメント