Director,导演类。
首先是在CCDirector.cpp文件中看到:
static DisplayLinkDirector *s_SharedDirector = nullptr;
确定了Director的单例模式设计原则。
DisplayLinkDirector,这个继承自Director。用来同步Timer,刷新屏幕
单例模式的设计精髓:
Director* Director::getInstance()
{
if (!s_SharedDirector) //当director实例不存的时候,创建之
{
s_SharedDirector = new (std::nothrow) DisplayLinkDirector();
CCASSERT(s_SharedDirector, "FATAL: Not enough memory");
s_SharedDirector->init();
}
return s_SharedDirector;
}
Director::init()方法:
设置程序运行默认值,包括FPS,是否显示FPS,GL Projection,Pixel Format等。
场景指针的初始化nullptr。
四个重要的事件回调:
const char *Director::EVENT_PROJECTION_CHANGED = "director_projection_changed";
const char *Director::EVENT_AFTER_DRAW = "director_after_draw";
const char *Director::EVENT_AFTER_VISIT = "director_after_visit";
const char *Director::EVENT_AFTER_UPDATE = "director_after_update";
initTextureCache();
initMatrixStack(); //初始化场景栈,投影栈,纹理栈
然后是重要的mainLoop函数,它是每帧都会调用的,原因可以看这里:XXOO
void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) //回收销毁 { _purgeDirectorInNextLoop = false; purgeDirector(); } else if (! _invalid) //执行渲染,Scheduler的操作 { drawScene(); // release the objects PoolManager::getInstance()->getCurrentPool()->clear(); } }
从上面的函数,知道每帧都会调用drawScene函数。
drawScene函数是cocos2dx引擎的大心脏!!!
里面的函数功能都是非常的重要的!(代码很长也要全部贴出来)瞻仰一下:
1 // Draw the Scene 2 void Director::drawScene() 3 { 4 // calculate "global" dt 5 calculateDeltaTime(); 6 7 // skip one flame when _deltaTime equal to zero. 8 if(_deltaTime < FLT_EPSILON) 9 { 10 return; 11 } 12 13 if (_openGLView) 14 { 15 _openGLView->pollInputEvents(); 16 } 17 18 //tick before glClear: issue #533 19 if (! _paused) 20 { 21 _scheduler->update(_deltaTime); //Scheduler调用的主开关,驱动着程序的Scheduler的执行。【重要】 22 _eventDispatcher->dispatchEvent(_eventAfterUpdate); 23 } 24 25 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 26 27 /* to avoid flickr, nextScene MUST be here: after tick and before draw. 28 XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */ 29 if (_nextScene) 30 { 31 setNextScene(); 32 } 33 34 pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 35 36 // draw the scene,场景绘制完以后,分发事件_eventAfterVisit 37 if (_runningScene) 38 { 39 _runningScene->visit(_renderer, Mat4::IDENTITY, false); 40 _eventDispatcher->dispatchEvent(_eventAfterVisit); 41 } 42 43 // draw the notifications node 44 if (_notificationNode) 45 { 46 _notificationNode->visit(_renderer, Mat4::IDENTITY, false); 47 } 48 49 if (_displayStats) //游戏运行FPS等参数显示开关 50 { 51 showStats(); 52 } 53 54 _renderer->render(); 55 _eventDispatcher->dispatchEvent(_eventAfterDraw); 56 57 popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW); 58 59 _totalFrames++; 60 61 // swap buffers 62 if (_openGLView) 63 { 64 _openGLView->swapBuffers(); 65 } 66 67 if (_displayStats) 68 { 69 calculateMPF(); 70 } 71 }
内容还有很多,随着后面的学习,定有补充,TODO....