发现cocos一个做法,似乎cocos比较少去自定义一个scene,于是一般的做法是自定义一个layer,并写一个createScene静态函数,在这个静态函数中,创建一个scene和这个layer的一个对象,并把这个对象加入scene中,返回scene。
另一个做法是把构造函数设为保护类成员,再专门定义一个create静态函数负责对象创建。cocos的对象估计都有一套内存管理策略,因此禁止了用户手动new和delete。
cocos用到不少新版c++的特性,例如回调函数的一个宏:
#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__)
用了新版的bind函数(以前只有bind1st和bind2nd)。这个函数是一个“适配器”,作用是把函数指针“改造”成一个函数对象,selector是函数指针,之后的都是参数。可以指定原来函数参数与新函数对象的对应关系,例如:
int f(int, char, double);
auto frev = bind(f, _3, _2, _1); // 翻转参数顺序
std::placeholders::_1表示宏定义中 “...”的第一个参数
有意思的是bind可以绑定非静态成员函数,例如:CC_CALLBACK_0(Test1Layer::closeItemFunc,this)),把this指针作为第一个参数即可。
bind函数的详细说明在这里。
总的来说,这个宏的用法如下:
CC_CALLBACK_0(函数指针,参数1(如果是成员函数,是this指针),参数2,参数3,...)生成一个有一个参数的普通函数对象,或一个有0个参数的成员函数对象