最近在学cocos2d,刚上手时对示例程序的函数调用关系不是很清楚。昨晚刚刚搞清楚,记录下。
1. 首先来看main函数:
[cpp] view plaincopyprint?
AppDelegate app; // 创建一个AppDelegate对象
...
return CCApplication::sharedApplication()->run(); // 运行 app 对象
2. 再看 AppDelegate 类:
[cpp] view plaincopyprint?
virtual bool applicationDidFinishLaunching(); // CCApplication::sharedApplication()->run(); 之后首先执行此函数
// Implement CCDirector and CCScene init code here.
bool AppDelegate::applicationDidFinishLaunching() {
...
// create a scene. it's an autorelease object
CCScene *pScene = HelloWorld::scene();
pDirector->runWithScene(pScene);
return true;
}
调用了层类(Layer)HelloWorld 的scene() 方法,并且通过 CCDirector 的一个实例来执行。
3. 最后看 HelloWorld 的 scene() 方法
[cpp] view plaincopyprint?
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
这个时候,定位create() 方法,指向 CREATE_FUNC(HelloWorld);
[cpp] view plaincopyprint?
/**
* define a create function for a specific type, such as CCLayer
* @__TYPE__ class type to add create(), such as CCLayer
*/
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
4. 总结
调用顺序为 main() -> AppDelegate ->HelloWorld::scene() -> CREATE_FUNC() -> init()
来源:http://blog.csdn.net/ironyoung/article/details/39546009?utm_source=tuicool