news 2026/9/4 8:15:42

【2014-07-09】cocos2dx学习笔记:cocos2dx3.x版本Director学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2014-07-09】cocos2dx学习笔记:cocos2dx3.x版本Director学习笔记

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-07-09| 标题:cocos2dx学习笔记:cocos2dx3.x版本Director学习笔记分类:编程 / C && C++ / cocos2dx |标签:cocos2dx·director


cocos2dx学习笔记:cocos2dx3.x版本Director学习笔记

    • 先看下初始化相关代码:
    • 然后是Director::setOpenGLView:
    • mainLoop:

通过前面的分析【 cocos2dx学习笔记:cocos2dx3.x版本程序初始化流程 】,我们可以简单了解到Director的外部调用逻辑:

首先在Application::run中调用了AppDelegate::applicationDidFinishLaunching申请了一个实例,设定了View,并且开始运行一个场景:

autodirector=Director::getInstance();。。。。 director->setOpenGLView(glview);。。。。 director->runWithScene(scene);

然后在Application::run方法中继续执行,进入了程序主循环:

while(!glview->windowShouldClose()){。。。。。 director->mainLoop();。。。。。}

这里我们简单的笔记下Director的代码。

先看下初始化相关代码:

//单例,注意这里的单例的类型是DisplayLinkDirector,是Director的一个子类。staticDisplayLinkDirector*s_SharedDirector=nullptr;//默认1s中60帧#definekDefaultFPS60// 60 frames per secondexternconstchar*cocos2dVersion(void);//几个自定义的事件的名称constchar*Director::EVENT_PROJECTION_CHANGED="director_projection_changed";constchar*Director::EVENT_AFTER_DRAW="director_after_draw";constchar*Director::EVENT_AFTER_VISIT="director_after_visit";constchar*Director::EVENT_AFTER_UPDATE="director_after_update";//单例Director*Director::getInstance(){if(!s_SharedDirector){s_SharedDirector=new(std::nothrow)DisplayLinkDirector();CCASSERT(s_SharedDirector,"FATAL: Not enough memory");s_SharedDirector->init();}returns_SharedDirector;}Director::Director(){}//Director的初始化方法,做了很多工作,包含了cocos2dx的放放面面,这里我们只关心几个流程。boolDirector::init(void){setDefaultValues();//设置程序默认值//初始化各种程序变量。。。。。 。。。。。// scheduler_scheduler=newScheduler();//定时器// action manager_actionManager=newActionManager();//动作管理器,管理各种actions_scheduler->scheduleUpdate(_actionManager,Scheduler::PRIORITY_SYSTEM,false);_eventDispatcher=newEventDispatcher();//事件分发器//各种自定义事件_eventAfterDraw=newEventCustom(EVENT_AFTER_DRAW);_eventAfterDraw->setUserData(this);_eventAfterVisit=newEventCustom(EVENT_AFTER_VISIT);_eventAfterVisit->setUserData(this);_eventAfterUpdate=newEventCustom(EVENT_AFTER_UPDATE);_eventAfterUpdate->setUserData(this);_eventProjectionChanged=newEventCustom(EVENT_PROJECTION_CHANGED);_eventProjectionChanged->setUserData(this);//init TextureCache//初始化TextureCache,用来管理用到的所有的材质initTextureCache();initMatrixStack();//初始化openGL绘制时的矩阵变换_renderer=newRenderer;//初始化cocos2dx的渲染器。这是cocos2dx3.x版本相对于2.x版本的最大的变动#if(CC_TARGET_PLATFORM!=CC_PLATFORM_WINRT)_console=newConsole;#endifreturntrue;}

然后是Director::setOpenGLView:

voidDirector::setOpenGLView(GLView*openGLView){CCASSERT(openGLView,"opengl view should not be null");if(_openGLView!=openGLView){// Configuration. Gather GPU infoConfiguration*conf=Configuration::getInstance();conf->gatherGPUInfo();CCLOG("%s ",conf->getInfo().c_str());//将传入的view的指针保存下来if(_openGLView)_openGLView->release();_openGLView=openGLView;_openGLView->retain();// set size_winSizeInPoints=_openGLView->getDesignResolutionSize();createStatsLabel();if(_openGLView){//设置openGL的默认值setGLDefaultValues();}//初始化渲染器_renderer->initGLView();CHECK_GL_ERROR_DEBUG();if(_eventDispatcher){//使能 事件分发_eventDispatcher->setEnabled(true);}}}

mainLoop:

voidDisplayLinkDirector::mainLoop(){。。。。。drawScene();。。。。。}// Draw the ScenevoidDirector::drawScene(){。。。。。//首先获取到输入事件if(_openGLView){_openGLView->pollInputEvents();}//tick before glClear: issue #533if(!_paused){_scheduler->update(_deltaTime);//定时器更新_eventDispatcher->dispatchEvent(_eventAfterUpdate);//特定事件分发//前面初始化时定义了一个自定义的事件,这里将它分发出去。这个时机为【 update调用之后 】}//清屏glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/* to avoid flickr, nextScene MUST be here: after tick and before draw. XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */if(_nextScene){setNextScene();}//矩阵变换pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);// draw the sceneif(_runningScene){_runningScene->visit(_renderer,Mat4::IDENTITY,false);//调用visit方法将场景所有元素传入_renderer_eventDispatcher->dispatchEvent(_eventAfterVisit);//特定事件分发//前面初始化时定义了一个自定义的事件,这里将它分发出去。这个时机为【 visit调用之后 】}// draw the notifications nodeif(_notificationNode){_notificationNode->visit(_renderer,Mat4::IDENTITY,false);}if(_displayStats){showStats();}_renderer->render();//渲染器绘制_eventDispatcher->dispatchEvent(_eventAfterDraw);//特定事件分发//前面初始化时定义了一个自定义的事件,这里将它分发出去。这个时机为【 渲染调用之后 】//矩阵变回来popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);_totalFrames++;// swap buffersif(_openGLView){_openGLView->swapBuffers();}if(_displayStats){calculateMPF();}}

笔记到这里,Director中比较有分量的代码已经贴出来了,其他的代码就不笔记了。可以发现,除了事件响应和渲染流程变化了之外,其他的和cocos2dx2.x版本没有太大的区别。

通过Director::init,我们知道了一下几个部件的初始化入口:
EventDispatcher 事件分发器
Scheduler 定时器
ActionManager 动作管理器
Renderer cocos2dx的渲染器
。。。。
。。。。
后续会笔记下这几个部件的大致的流程,其他的部件和2.x版本差不多,就不再笔记了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 8:15:36

MATLAB实现InSAR时序分析:从原理到工程实践

简介:本资源是一套面向遥感科学家、地质工程师及GIS技术人员的InSAR时序分析实战教程,聚焦MATLAB平台实现地表形变高精度反演,服务于地质灾害预警、城市沉降监测与冰川变化研究等实际应用场景。压缩包共8个文件(4.73MB&#xff09…

作者头像 李华
网站建设 2026/9/4 8:15:19

ST7735S驱动深度解析:SPI显示链路调试与双平台实践

简介:本资源是一套面向单片机初学者与课程设计者的1.8寸TFT液晶显示模块(ST7735S)完整驱动开发包,专为C51与STM32平台提供SPI接口屏的快速上手支持。资源包含C51与STM32双平台驱动源码、图文混合测试程序、硬件规格书及配套字体/图…

作者头像 李华
网站建设 2026/9/4 8:14:07

Spring Boot+Vue体育馆预约平台开发实战:从设计到部署全流程解析

简介:本资源是一套完整的体育馆使用预约平台毕业设计项目,面向计算机专业本科生及Java全栈初学者,旨在解决传统场馆预约流程不规范、人工管理效率低、数据容错性差等实际问题。系统基于Spring Boot后端框架与Vue前端框架构建,采用…

作者头像 李华
网站建设 2026/9/4 8:13:02

从提示词到控制系统:Loop Engineering 如何重塑 AI Agent 工程范式

目录 一、Loop Engineering 的真正含义:AI 工程的杠杆点正在上移 (一)从“我来提示模型”到“系统来驱动模型” 1、Prompt Engineering 解决的是单次决策质量 2、Context Engineering 解决的是模型在当前一轮“看见什么” (二…

作者头像 李华
网站建设 2026/9/4 8:12:52

语音识别私有化部署需要什么硬件?CPU、GPU、NPU 怎么为离线 ASR 配置

技术专题 / 企业级 AI 基础设施不要只问服务器价格:从音频路数、实时因子、模型实例到故障冗余,建立企业本地 ASR 容量模型企业准备做语音识别私有化部署时,常见的第一个问题是“需要几台服务器、几张 GPU”。但硬件数量不能脱离音频路数和…

作者头像 李华
网站建设 2026/9/4 8:10:46

硬件工程师必备:深入解析二极管伏安特性曲线及其工程应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华