转自:凌建风 http://cn.cocos2d-x.org/tutorial/show?id=2103

        cocos中导演毫无疑问是整个游戏的导航仪。而且它还身兼数职, 为我们杀先锋,做保姆,当保安。那这货到底是何方神圣?不要慌,视频会从导演的三个模块去讲解,这三个模块分别是导演概况、任务职责,以及一些常用的API。

一、基础概括

  • 在游戏运行前,它负责设置游戏的运行环境

  • 在游戏运行中,它负责控制游戏的主循环

  • 同样在游戏运行中,它兼管了场景的管理和切换


二、详细介绍

2.1 底层环境设定

A. 设置显示游戏的视图,包含视图的投射、像素格式等等

B. 设置游戏运行时的帧率

C. 初始化计时器,动作管理器和事件管理器

D. 初始化贴图缓存和渲染器(OpenGL ES 2.0、WebGL、Canvas)

(注:PC浏览器使用WebGL;移动浏览器、iOS8用WebGL,其他都用Canvas;Native平台上,使用OpenGL ES 2.0。)

E. 获取屏幕尺寸

F. 其他导演对象的设置


2.2 执行主循环

A. 计算从上一帧开始到现在的时间,用于提供调试信息

B. 执行定时器中被计划的任务

C. 通过事件管理器通知cc.director.EVENT_AFTER_UPDATE事件

D. 清空游戏屏幕

E. 在需要的时候进行场景切换

F. 遍历当前场景中的节点并更新节点的空间转换矩阵以及其他必要信息

G. 通过事件管理器通知cc.director.EVENT_AFTER_VISIT事件

H. 渲染器按顺序执行所有渲染指令,最终绘制整个场景到屏幕上

I. 通过事件管理器通知cc.director.EVENT_AFTER_DRAW事件

J. 控制主循环(通过cc.director.pause()以及cc.director.resume()进行控制)

K. 增加全局总帧数


下面我们用一张图来表示游戏的循环:

游戏循环500.jpg

此图来自秦春林前辈的《我所理解的cocos2d-x》


三、相关API

导演涉及到的API大致分为两个方面,一个方面对游戏的场景进行管理,另一个方面对游戏的属性进行设置及获取。下面分别对它们进行介绍。


1、场景管理

1.1 运行目标场景

1
cc.director.runScene(scene);

1.2 获取当前正在运行的场景

1
var scene = cc.director.getRunningScene();

1.3 压入场景

1
var scene = cc.director.pushScene(scene);

压入场景时要注意,压入的场景资源不能过大,否则有可能造成内存不足等问题。

通常用于"设置"界面的压入。场景的压入和推出采用的是栈结构。

1.4 推出场景

1
cc.director.popScene();

1.5 回到根场景

1
cc.director.popToRootScene();

1.6 场景特效切换


该部分将在场景(Scene)一节中进行介绍,这里不过多说明。


2、游戏属性设置及获取

2.1 获取游戏主循环是否被暂停

1
var isPaused = cc.director.isPaused();

2.2 设置或获取动画帧间隔

1
2
3
4
//设置动画帧间隔,该设置会直接对帧率造成影响
cc.director.setAnimationInterval(value);
//获取动画帧间隔
var interval = cc.director.getAnimationInterval();

2.3 设置或获取导演对象的内容缩放比例

1
2
3
4
//获取导演对象的缩放比例
var scale = cc.director.getContentScaleFactor();
//设置导演对象的缩放比例
cc.director.setContentScaleFactor(scaleFactor);

2.4 获取游戏世界可视窗口的原点和大小

1
2
3
4
//返回正在运行场景的可视区域原点
var origin = cc.director.getVisibleOrigin();
//返回正在运行场景的可视区域大小
var size = cc.director.getVisibleSize();

2.5 获取游戏世界的大小

1
2
3
//winSize的大小通常等同于设计分辨率,而winSizeInPixel的大小是游戏世界的像素大小
var winSize = cc.director.getWinSize();
var winSizeInPixel = cc.director.getWinSizeInPixels();

2.6 设置或获取调试信息(左下角的帧率等)是否被显示

1
2
3
4
//返回是否显示了调试信息
var isDisplaying = cc.director.isDisplayStats();
//设置是否显示调试信息
cc.director.setDisplayStats(displayStats);

2.7 设置或获取视图,指向cc.View

1
2
3
4
//获得CCEGLView,所有东西都会渲染到它上面
var view = cc.director.getOpenGLView();
//设置所有东西都被渲染到的视图,不要调用这个函数
cc.director.setOpenGLView(openGLView);

2.8 设置或获取WebGL/OpenGL的投影

1
2
3
4
5
6
7
8
/*可能的投影类型有:
1. cc.Director.PROJECTION_2D
2. cc.Director.PROJECTION_3D
3. cc.Director.PROJECTION_CUSTOM */
//获取投影
var projection = cc.diretor.getProjection();
//设置投影
cc.director.setProjection(projection);

至此,和导演(Director)相关的内容也讲解的差不多了。本期内容中含有大量代码,建议大家在学习过程中都多运行几遍,熟悉导演中各个方法的功能。下期我们将要讲解的是,渲染框架中的重点:节点(Node)。