在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的更多相关文章

  1. 浅谈Vue.js

    作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...

  2. 闲聊——浅谈前端js模块化演变

    function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...

  3. 浅谈对Js闭包的理解

    理解Js的闭包,首先让我们先看几个概念 执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境. 作用域链(scope chain)子函数继承父函数, ...

  4. 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异

    Underscore.js是一个很精干的库,压缩后只有5.2KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程. 本文仅探讨Underscore.js的两个 ...

  5. Vue 浅谈前端js框架vue

    Vue Vue近几年来特别的受关注,三年前的时候angularJS霸占前端JS框架市场很长时间,接着react框架横空出世,因为它有一个特性是虚拟DOM,从性能上碾轧angularJS,这个时候,vu ...

  6. 【转】浅谈Node.js单线程模型

    Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程.高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和异步I/O?本文将围绕这 ...

  7. 浅谈 Unserscore.js 中 _.throttle 和 _.debounce 的差异

    来源:http://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs Unsersco ...

  8. 【第三周读书笔记】浅谈node.js中的异步回调和用js-xlsx操作Excel表格

    在初步学习了node.js之后,我发现他的时序问题我一直都很模糊不清,所以我专门学习了一下这一块. 首先我们来形象地理解一下进程和线程: 进程:CPU执行任务的模块.线程:模块中的最小单元. 例如:c ...

  9. 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异[转]

    看的文章来自: https://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs 使用 ...

  10. 浅谈对js原型的理解

    一.  在JavaScript中,一切皆对象,每个对象都有一个原型对象(prototype),而指向该原型对象的内部指针则是__proto__.当我们对对象进行for in 或者for of遍历时,就 ...

随机推荐

  1. day12 十二、开放封闭、装饰器

    一.nonlocal关键词 # global # num = # def fn(): # global num # L>G 将局部的名字与全局统一 # num = # fn() # print( ...

  2. Web开发——HTML基础(高级文本格式 列表/style)

    文档资料参考: 参考:https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Advanced_text_fo ...

  3. axios库的使用

    axios是基于Promise 用于浏览器和 nodejs 的 HTTP 客户端:可以用在webpack + vuejs 的项目中 原文 https://github.com/axios/axios ...

  4. 使用hashlib进行登录校验

    注册登录和密码验证 用户注册时,文件中保存用户名,和密码的密文 登录时,密码与文件中的密文进行比较,如果相同就同意登录 import hashlib # 导入模块 def md5(username,p ...

  5. python练习题-day13

    1.获取移动平均值 def wrapper(fun): def inner(*args,**kwargs): ret=fun(*args,**kwargs) ret.__next__() return ...

  6. java框架之SpringBoot(8)-嵌入式Servlet容器

    前言 SpringBoot 默认使用的嵌入式 Servlet 容器为 Tomcat,通过依赖关系就可以看到: 问题: 如何定制和修改 Servlet 容器相关配置? SpringBoot 能否支持其它 ...

  7. stl string的erase方法

    ; i < s.size(); i++) { ') { s.erase(i,); i--; } } 删除string中的所有0.

  8. python列表常用内建方法

    python列表常用内建方法: abc = ['a',1,3,'a'] #abc.pop(1) #删除索引1的值.结果['a', 3] #abc.append([123]) #结果:['a', 1, ...

  9. List查询重复值的个数,并根据重复的数目从多到少排列

    package ttt; import java.nio.MappedByteBuffer; import java.util.ArrayList; import java.util.Collecti ...

  10. flask 定义数据库关系(多对多)

    多对多 我们使用学生和老师来演示多对多关系:每个学生有多个老师,每个老师有多个学生.多对多关系示意图如下: 在实例程序中,Student类表示学生,Teacher类表示老师.在这两个模型之间建立多对多 ...