具体来讲,Cocos2d-JS中的导演是一个对象,它负责设置游戏的运行环境,控制游戏的住循环而且管理场景和场景的切换。node
Cocos2d-JS中导演对象名为:cc.director
。下面是它主要的任务:缓存
环境设定 函数
首先,在进入游戏以前,导演对象会设置游戏的运行环境:测试
执行主循环 动画
视频游戏的基本原理实际上是和传统动画是同样的。在传统动画制做中,画师们一页一页得绘制静态的画面,这些画面最终会以很快的频率一幅幅展现出来。频率能够是好比每秒24张画,每张画面被称为一帧。this
视频游戏的绘制方式是彻底同样的,每1/60秒,程序会绘制一张图片(一帧)到屏幕上,也就是60帧每秒。其中每一帧的绘制过程包含计算全部可视节 点的转换矩阵以及其余信息,而后画面会一帧一帧得显示到屏幕上。随着游戏的进行,每一帧都会改变一点点,最后,玩家的眼前就会呈现出优美的游戏画面。spa
以上所描述的全部过程都是在cc.director
的主循环中完成的。主循环中每一次循环绘制一幅画面到屏幕上。下面是每一帧绘制的详细过程: 设计
cc.Director.EVENT_AFTER_UPDATE
事件。cc.Director.EVENT_AFTER_VISIT
事件。cc.Director.EVENT_AFTER_DRAW
事件。 除此以外,cc.director
一样提供一些函数来控制主循环:调试
cc.director.pause()
cc.director.resume()
场景管理code
导演对象的另外一项重要任务就是场景管理,导演对象在同一时间只能够运行一个场景,可是你能够随意得切换运行场景。因此一般来讲,一个游戏会包含用于不一样用例的几个场景,你的程序应该经过cc.director
的API来控制场景流。
// 让导演对象执行目标场景 cc.director.runScene(scene); // 获取当前正在执行的脚本 var scene = cc.director.getRunningScene(); // 将一个新场景推入场景栈中,并替换运行场景为这个新场景 var scene = cc.director.pushScene(scene); // 将场景栈顶的场景推出场景栈,并替换运行场景为推出后栈顶的新场景 cc.director.popScene(); // 将场景栈中除了栈底的根场景之外的全部场景推出,并替换运行场景为根场景。 cc.director.popToRootScene()
除此以外,你能够经过cc.TransitionScene
的效果类的转场特效来切换场景。
// 转场特效持续两秒 var transitionTime = 2; // 建立下一个场景 var nextScene = new cc.Scene(); // 使用下一个场景建立转场特效场景 var transitionScene = new cc.TransitionProgressInOut(transitionTime, nextScene); // 替换运行场景为转场特效场景 cc.director.runScene(transitionScene);
在上面的例子中能够看出,咱们使用了一个cc.TransitionProgressInOut
转场特效,没有使用cc.TransitionScene
是由于这个基础特效类没有任何实际效果,只提供运行机制。Cocos2d-JS引擎中还提供其余不少种预设转场特效,你能够参考API文档或是TransitionScene测试用例。
环境设置和属性
因为导演对象控制整个游戏运行环境,导演对象中还提供一些经常使用的设置和属性:
// 获取游戏主循环是否被暂停 var paused = cc.director.isPaused(); // 设置或获取动画帧间隔,这个设置会直接影响帧率 var interval = cc.director.getAnimationInterval(); cc.director.setAnimationInterval(value); // 设置或获取导演对象的内容放缩比例 var scale = cc.director.getContentScaleFactor(); cc.director.setContentScaleFactor(scaleFactor); // 设置或获取游戏世界可视窗口的原点和大小 var origin = cc.director.getVisibleOrigin(); var size = cc.director.getVisibleSize(); // 获取游戏世界大小,winSize的大小一般等同于设计分辨率,而winSizeInPixel的大小是游戏世界的像素大小 var winSize = cc.director.getWinSize(); var winSizeInPixel = cc.director.getWinSizeInPixels(); // 设置或获取调试信息是否被显示 var isDisplaying = cc.director.isDisplayStats(); cc.director.setDisplayStats(displayStats); // 设置或获取视图,它指向`cc.view` cc.director.var view = cc.director.getOpenGLView(); cc.director.cc.director.setOpenGLView(openGLView); // 设置或获取WebGL/OpenGL的投影, // 可能的投影类型包括:cc.Director.PROJECTION_2D, cc.Director.PROJECTION_3D, cc.Director.PROJECTION_CUSTOM cc.director.getProjection(); cc.director.setProjection(projection);
计时器
正如以前提到的,游戏主循环会经过计时器执行预约的任务。这个计时器是导演对象的一个内部子系统,你能够对当前运行场景的节点执行一些类型的任务。计时器将会计划什么时候以及如何执行这些任务。
下面的代码片断展现了一些经常使用的建立任务的方式:
var node = new cc.Node(); // node的update函数将会在每一帧被执行 node.scheduleUpdate(); // callback回调函数会重复得在每一个interval时间间隔以后被执行,重复次数为repeat次,而且这个任务会在delay延时以后开始执行 node.schedule(callback, interval, repeat, delay); // callback回调函数会在delay延时以后被执行一次 node.scheduleOnce(callback, delay); // 取消callback任务 node.unschedule(callback); // 取消node节点全部计划中的任务 node.unscheduleAllCallbacks();
注意
全部任务中的回调函数会在本身的目标节点环境下被执行,也就是说,回调函数中的this
对象将会指向目标节点
即便delay延时为0的状况下,任务回调函数的第一次执行也是在注册任务以后的下一帧中。
动做管理器
动做管理器是导演对象另外一个重要的内部系统。它管理当前运行场景中的全部动做,它会在每一帧调用全部进行中动做的update
函数。动做系统的细节会在后面的章节中详细讨论。
导演对象系统事件
导演对象还有一些内建的系统事件,可能会对你控制游戏的逻辑有帮助。
cc.Director.EVENT_AFTER_DRA、// 这个事件在每一帧图像的绘制完成以后被触发。 cc.Director.EVENT_AFTER_VISIT // 这个事件在每一帧场景树遍历以后被触发。 cc.Director.EVENT_AFTER_UPDATE // 这个事件在每一帧计时器任务执行完成以后被触发。 cc.Director.EVENT_PROJECTION_CHANGED //这个事件在导演对象的投影属性被修改以后触发