浅谈Cocos2d-js cc.director

Posted Mike丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Cocos2d-js cc.director相关的知识,希望对你有一定的参考价值。

在cocos2d-x里面,游戏的任何时间,只有一个场景对象实例处于运行状态,该对象可以作为当前游戏内容的整体包对象。

 

环境设定

进入游戏之前,导演会设置游戏的运行环境:

  1. 设置游戏视图,包含视图的投射,像素格式等。
  2. 设置游戏的运行帧率。
  3. 初始化定时器,动作管理器和事件管理器(为当前导演对象服务)
  4. 初始化贴图缓存和渲染器(为当前导演对象服务)
  5. 导演对象的其他设置。

执行主循环

主循环中每一次循环渲染一副画面到屏幕上。下面是每一帧绘制的详细过程

  1. 计算上一帧开始到现在的时间(用于提供调试信息)
  2. 让导演对象中计时器执行被计划的任务。
  3. 通过时间管理器通知cc.Director.EVENT_AFTER_UPDATE事件。
  4. 清空屏幕。
  5. 如果需要进入下一个场景则进行场景切换。
  6. 遍历当前场景中的节点并更新节点的空间转换矩阵以及其他必要的信息,然后发送绘制指令给渲染器
  7. 通过时间管理器通知cc.Director.EVENT_AFTER_VISI事件。
  8. 渲染器按顺序执行所有渲染指令来最终绘制整个场景到屏幕上。
  9. 增加全局总帧数。

cc.director同样提高一些函数来控制主循环:

暂停主循环:cc.director.pause()

恢复主循环:cc.director.resume()

场景管理

通常来说,一个游戏包含用于不同用例的几个场景,程序应该通过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);

环境设置和属性

由于导演对象控制整个游戏运行环境,导演对象中还提供一些常用的设置和属性:

// 获取游戏主循环是否被暂停
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`
var view = cc.director.getOpenGLView();
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);

导演对象系统事件

cc.director.EVENT_AFTER_DRAW: 这个事件在每一帧图像绘制完成之后被触发。

cc.director.EVENT_AFTER_VISIT: 这个事件在每一帧场景树遍历之后被触发。

cc.director.EVENT_AFTER_UPDATE: 这个事件在每一帧计时器任务执行完成之后被触发。

cc.director.EVENT_PROJECTION_CHANGED: 这个事件在导演对象的投影属性被修改之后触发。

 

以上是关于浅谈Cocos2d-js cc.director的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-js去掉左下角的三行数字(帧数)

浅谈Cocos2d-js ListView滑动防止误触

cocos creator cc.Director与资源加载策略

cocos creator基础-(二十四)cc.Director与资源加载策略

CocosCreator原生平台退出游戏,暂停和继续

浅谈Java堆内存分代回收