加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2d 中 scene(), create(), init() 调用关系

发布时间:2020-12-14 17:00:45 所属栏目:百科 来源:网络整理
导读:原文 http://blog.csdn.net/ironyoung/article/details/39546009 最近在学cocos2d,刚上手时对示例程序的函数调用关系不是很清楚。昨晚刚刚搞清楚,记录下。 1. 首先来看main函数: AppDelegate app; // 创建一个AppDelegate对象 ... return CCApplication::
原文

http://blog.csdn.net/ironyoung/article/details/39546009


最近在学cocos2d,刚上手时对示例程序的函数调用关系不是很清楚。昨晚刚刚搞清楚,记录下。

1. 首先来看main函数:

AppDelegate app; // 创建一个AppDelegate对象
    ...
    return CCApplication::sharedApplication()->run(); // 运行 app 对象

2. 再看 AppDelegate 类:

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() 方法

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;
}

这时候会有疑问,那 HelloWorld::init() 方法在哪儿使用了?而且 HelloWorld 哪儿有 create() 方法?

这个时候,定位create() 方法,指向 CREATE_FUNC(HelloWorld);

/**
 * 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; 
  } 
}

根据宏定义可以知道,create() 即为CREATE_FUNC();将__TYPE__换成 HelloWorld 之后,则在 if 判断中调用了 init() 函数

4.总结

调用顺序为 main() -> AppDelegate->HelloWorld::scene()-> CREATE_FUNC()-> init()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读