Director 导演类, 这个类在整个引擎中担当着最重要的角色, 先看看它是如何初始化的,它共管理了哪些内容呢?
1初始化- 更新处理Scheduler
Scheduler 这个类负责用户自定义的更新函数的调用, 或游戏对象的update(float dt)的调用。 像经常调用的schedule() 或scheduleUpdate() 就是这个类来负责处理的。
见下面的代码, 就是程序中如何使用schedule。 具体如何处理, 在后面的还会进行展开。 这块可以单拿出一章来介绍一下了。
1 this->schedule(schedule_selector(HelloWorld::update), 10);
2初始化- 事件管理 EventDispatcher
EventDispatcher 这个类负责整个系统的事件处理,如用户自定义事件, 触摸事件,等都由这个类来负责。
现在我们知道,它是在这里申明即可, 具体在哪里进行调用, 事件的实现原理, 也会在一章内进行展开。
下面定义了几种不同的事件,为后面相应的事件触发时作为参数调用及触发事件。
_eventDispatcher = new (std::nothrow) EventDispatcher(); _eventAfterDraw = new (std::nothrow) EventCustom(EVENT_AFTER_DRAW); _eventAfterDraw->setUserData(this); _eventAfterVisit = new (std::nothrow) EventCustom(EVENT_AFTER_VISIT); _eventAfterVisit->setUserData(this); _eventAfterUpdate = new (std::nothrow) EventCustom(EVENT_AFTER_UPDATE); _eventAfterUpdate->setUserData(this); _eventProjectionChanged = new (std::nothrow) EventCustom(EVENT_PROJECTION_CHANGED); _eventProjectionChanged->setUserData(this);
3初始化纹理缓存TextureCache
TextureCache 纹理缓存,进行纹理处理, 重量级类, 在后面展开。
initTextureCache(); void Director::initTextureCache() { #ifdef EMSCRIPTEN _textureCache = new (std::nothrow) TextureCacheEmscripten(); #else _textureCache = new (std::nothrow) TextureCache(); #endif // EMSCRIPTEN }
4 初始化矩阵OpenGLES用到initMatrixStack();
矩阵,OpenGLES转换坐标时用到的,一个坐标的计算方式: 投影矩阵 × 视图矩阵 × 模型矩阵 × 3D位置
1 _modelViewMatrixStack 模型矩阵
2 _projectionMatrixStack 视图投影矩阵
3 _textureMatrixStack 纹理矩阵, 这个做什么用的, 我还没深入看, 后面再说。
_modelViewMatrixStack.push(Mat4::IDENTITY);
_projectionMatrixStack.push(Mat4::IDENTITY);
_textureMatrixStack.push(Mat4::IDENTITY);
5 初始化Render
渲染, 这个渲染有的说, 现在我们知道通过它调用 我们真正的OpenGL 渲染命令。
这个类设计了一个渲染队列RenderQueue(先简化点认为就一个吧),用户的渲染请求, 自定义的也好, 系统的也好, 都被封装成为了渲染命令加入到这个渲染队列队列中。
这个类设计的也很有意思,做了很多的优化设计。 后面详细说它。
_renderer = new (std::nothrow) Renderer; Renderer::Renderer() :_lastMaterialID(0) ,_lastBatchedMeshCommand(nullptr) ,_filledVertex(0) ,_filledIndex(0) ,_numberQuads(0) ,_glViewAssigned(false) ,_isRendering(false) #if CC_ENABLE_CACHE_TEXTURE_DATA ,_cacheTextureListener(nullptr) #endif { _groupCommandManager = new (std::nothrow) GroupCommandManager(); _commandGroupStack.push(DEFAULT_RENDER_QUEUE); RenderQueue defaultRenderQueue; _renderGroups.push_back(defaultRenderQueue); _batchedCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE); }
总结一下:
可以看到,更新函数处理,事件处理,纹理缓存,渲染都已经在这个类中初始化了,也在这个类对外提供调用,Director还是一个单例类。 而runScene() 是如何处理的呢?后面跟上。
就算当不成英雄,也要是一条好汉| 空谈误国,实干兴邦。