原文: http://www.cnblogs.com/walzer/archive/2010/10/10/1847089.html
拜读王哲王总的cocos2d-x入门教程,将学习过程中对C++或cocos2d-x框架不熟悉的知识点按自己的理解在此作个记号。
1.以下关联语句:
GameOverLayer():_label(NULL) {};
CCX_SYNTHESIZE_READONLY(cocos2d::CCLabel*, _label, Label);
其实是定义一个只读属性Label,在类中可以使用this->getLabel来访问。
如果是CCX_SYNTHESIZE,则定义的属性是可读写(可以使用this->setLabel)。
套用C#的思维,可以使用如下代码来对照理解(类名为GameOverLayer):
private cocos2d::CCLabel _label=null;
protected cocos2d::CCLabel Label
{
get{return _label;}
set{_label = value;}//如果是CCX_SYNTHESIZE宏定义,则属性可写
}
2.几个宏:
(1)CCX_SYNTHESIZE(varType, varName, funName)与CCX_SYNTHESIZE_READONLY(varType, varName, funName)
根据宏声明,第一个参数varType是变量的类型,第二个参数是变量名称,第三个参数是getter或setter访问器名称。
参考第1点中的写法,这边声明了一个名称为 _label的变量,其类型为第一个参数指定(这里是CCLabel),第三个参数表明我们在程序中如何访问这个变量:set+funName/get+funName,也就是setLabel/getLabel。
注:CCX_SYNTHESIZE_READONLY表示这个属性只有getXXX访问方法
(2)LAYER_NODE_FUNC(layer)
宏定义原文:for the subclass of CCLayer, each has to implement the static "node" method
(3)SCENE_NODE_FUNC(scene)
宏定义原文:for the subclass of CCScene, each has to implement the static "node" method
用2、3两个宏的原因在教程中也说的比较清楚“ 由于cpp里没有self这种强大的关键字,所以CCLayer::node()和CCScene::node()方法的都需要派生类自己实现一份,不能像objc那样直接从父类继承下来靠self关键字变成指向自己的对象。由于每份node方法的代码都类似,我们就做了两个宏来方便大家 LAYER_NODE_FUNC和SCENE_NODE_FUNC. 如果想使用这两个宏,就必须在派生类里实现bool init()方法。”
3.CGRect::CGRectInterestcRect
CGRect类里包含了很多有关坐标/区域的函数,这个判断两个矩形区域是否交叉。
4. 5种回调函数类型:(可以理解为C#中的事件激发)
schedule_selector callfunc_selector callfuncN_selector callfuncND_selector menu_selector