问题2-1:CCDirector类是什么时候创建?
问题2-2:cocos2d-x应用窗口的消息回调函数是如何和CCDirector类创建连接起来的?
创建AppDelegate对象后,全局唯一AppDelegate对象会执行run函数进行消息循环处理;创建CCEGLView对象后,该全局唯一CCEGLVie对象会处理win消息回调,也就是LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)。若不懂请回看第一节。 |
2、创建窗口对象后,第一次激活窗口显示的时,CCEGLView::WindowProc函数会做相应处理,关键代码就是444行: 典型分析如下: 1)444行这块代码是典型的多态,用父类指针执行子类对象。 2)没有C++基础的同学,请思考,多态实现的三个条件,不管是C还是Java都一样。 (1有继承,2要虚函数重写,3父类指针指向子类对象), 3)多态的结果就是,从父类CCApplication,去执行子类AppDelegate::applicationWillEnterForeground()函数。 4)AppDelegate::applicationWillEnterForeground()函数会执行,CCDirector::sharedDirector()->startAnimation();就会被调用。
5)CCDirector::sharedDirector()就是这句话,第一次调用,开始产生CCDirector类的对象。 我们再看该函数内做了什么。
注意一点细节的是,创建CCDisplayLinkDirector类对象,继承关系如下: class CCDisplayLinkDirector : public CCDirector。其中CCDisplayLinkDirector类重写了以下几个方法 virtual void mainLoop(void); virtual void setAnimationInterval(double dValue); virtual void startAnimation(void); virtual void stopAnimation()。 6)我们再看s_SharedDirector->init()函数做了什么。
狐狸的尾巴终于露出来了。就是在这个在bool CCDirector::init(void)函数里面,cocos2d-x框架初始化了各种各样的器件。王保明bombing提醒你,一种典型的组合设计方法清晰可见、敬佩之情悠然而生。 在这里你仔细看看吧。最值得你看的地方。 // scheduler cocos2d-x中的调度器 m_pScheduler = new CCScheduler(); // action manager cocos2d-x中的动作管理器 m_pActionManager = new CCActionManager(); // touchDispatcher cocos2d-x中的触屏管理器 m_pTouchDispatcher = new CCTouchDispatcher(); // KeypadDispatcher pad派发器 m_pKeypadDispatcher = new CCKeypadDispatcher();
// create autorelease pool 内存自动清理管理器 CCPoolManager::sharedPoolManager()->push();
很多公司就是在这个地方进行cocos2d-x框架源码功能增强。比如:底层数据的加密;硬件设备调度等。
2 cocos2d-x之CCDirector类2CCDirector与CCEGLView、AppDelegate产生关系图 cocos2d-x框架创应用类、视图类、导演类顺序示意图如下:
从图中可以总结如下: 1) cocos2d-x框架创建AppDelegate单例对象; 2) cocos2d-x框架创建CCEGLView单例对象,注册win窗口类和win窗口过程回调函数 3) cocos2d-x框架在CCEGLView类的win窗口过程回调函数中(处理窗口第一次显示消息),创建了CCDirector类对象。并初始化了CCDirector类各种管理功能(包括调度器、动作管理器、内存释放池等)。 4) cocos2d-x框架的AppDelegate的run函数,调用applicationDidFinishLaunching()入口,完成界面元素的创建,包括创建场景、初始化场景各个元素。 5) cocos2d-x框架的AppDelegate的run函数,按照默认帧频率循环调用CCDirector::sharedDirector()->mainLoop(),不断地显示win窗口。 6) 至此这个应用程序的初始化流程完毕。 |