【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
为何将单例模式移除
在Cocos2d-JS v3.0之前。全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环。可惜的是,这样的统一性也在非常大程度上限制了Cocos2d-html5的发展,有一些在C++中非常有意义的涉及搬到Html5平台后却使得Cocos2d-html5变得臃肿。所以在3.0版中,我们决定将一些API改造成更适合JavaScript开发者的API。这篇文档中将要展示的是单例类的改造。
拿cc.SpriteFrameCache为例:
// 在2.2.2版中。假设我们想通过cc.SpriteFrameCache来创建帧图像,再通过帧图像来创建Sprite
cc.SpriteFrameCache.getInstance().addSpriteFrames(s_boxs_plist);
var boxFrame = cc.SpriteFrameCache.getInstance().getSpriteFrame("box_normal_00.png");
var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);
首先,这种代码非常长而且较难阅读。其次,不论cc.SpriteFrameCache的单例对象是否被创建。获取它都将产生函数调用。假设开发人员们不够注意。使用它载入非常多帧图像而且创建非常多精灵又不缓存cc.SpriteFrameCache的单例对象,那么在javascript上必定造成一定程度的性能损失。
最后。也是最重要的是。单例设计模式是为了保护类的单例对象,防止用户反复创建其对象。只是作为javascript开发人员我们都知道。这没什么意义:
// 我们能够非常easy得获取`cc.SpriteFrameCache`的实际单例对象
cc.s_sharedSpriteFrameCache.addSpriteFrames(s_boxs_plist);
// 假设我们想,我们也能够创建还有一个精灵帧缓存对象
var myCache = new cc.SpriteFrameCache();
因此,我们决定Cocos2d-JS v3.0的首要任务就是提供一套更精简更符合JavaScript代码风格的API,这也是重构单例类的好机会。
重构列表
v3.0中部分被重构的单例类例如以下 :
// In engine core
cc.Configuration.getInstance() --> cc.configuration
cc.ShaderCache.getInstance() --> cc.shaderCache
cc.TextureCache.getInstance() --> cc.textureCache
cc.AnimationCache.getInstance() --> cc.animationCache
cc.SpriteFrameCache.getInstance() --> cc.spriteFrameCache
cc.Screen.getInstance() --> cc.screen
cc.TIFFReader.getInstance() --> cc.tiffReader
cc.IMEDispatcher.getInstance() --> cc.imeDispatcher
// In extension
ccs.GUIReader.getInstance() --> ccs.guiReader
ccs.SceneReader.getInstance() --> ccs.sceneReader
ccs.DataReaderHelper --> ccs.dataReaderHelper
ccs.SpriteFrameCacheHelper.getInstance() --> ccs.spriteFrameCacheHelper
ccs.ArmatureDataManager.getInstance() --> ccs.armatureDataManager
ccs.ActionManager.getInstance() --> ccs.actionManager
ccs.TriggerMng.getInstance() --> ccs.triggerManager
ccs.ObjectFactory.getInstance() --> ccs.objectFactory
这些单例类在3.0中变成了纯对象。类似以下的实现:
cc.screen = {
init: function () {
//...
},
fullScreen: function() {
//...
},
requestFullScreen: function (element, onFullScreenChange) {
//...
},
exitFullScreen: function () {
//...
},
autoFullScreen: function (element, onFullScreenChange) {
//...
}
};
还有一方面,当我们须要继承和扩展时,作为类本身对于结构可能是非常有裨益的,所以并非全部的单例类都适合被重构为对象。
可是我们又希望提供给开发人员统一的API风格,所以我们保留了部分类的类实现而且直接提供了它的单例对象,下面这些类在3.0版中是这样实现的:
cc.AudioEngine.getInstance() --> cc.audioEngine
cc.Director.getInstance() --> cc.director
cc.EGLView.getInstance() --> cc.view
cc.SAXParser.getInstance() --> cc.saxParser
cc.PlistParser.getInstance() --> cc.plistParser
请留意全部单例对象都是以首字母小写来命名的。这是为了区分一个变量名代表的是类还是对象。
另外。cc.EGLView是最早在Cocos2d-iPhone中被定义的,所以它的名字来源于iOS中的OpenGL ES视图的名字。可是在Cocos2d-JS中。它不过游戏的视图,能够是WebGL或OpenGL视图但同一时候也可能是Canvas视图,所以我们决定将它重命名为cc.view。
结果
重构之后,文档最初的样例在v3.0中将如以下代码所看到的:
cc.spriteFrameCache.addSpriteFrames(s_boxs_plist);
var boxFrame = cc.spriteFrameCache.getSpriteFrame("box_normal_00.png");
var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);
我们衷心希望这样的新的API风格能够让JavaScript开发人员们开发起来更加得心应手。
【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象的更多相关文章
- bootbox.js官方文档中文版
bootbox.js官方文档中文版简介:Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Boot ...
- Bootstrap入门(二十五)JS插件2:过渡效果
Bootstrap入门(二十五)JS插件2:过渡效果 对于简单的过渡效果,只需将 transition.js 和其它 JS 文件一起引入即可.如果你使用的是编译(或压缩)版的bootstrap.js ...
- Mysql优化(出自官方文档) - 第五篇
目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- Hui之Hui.js 官方文档
基础 // 判断值是否是指定数据类型 var result = hui.isTargetType("百签软件", "string"); //=>true ...
- 比官方文档更易懂的Vue.js教程!包你学会!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门> ...
- Spring 4 官方文档学习(五)核心技术之SpEL
题外话 官方文档用evaluate这个单词来描述从表达式中获得实际内容的过程.如果直译的话,应该是评估.估值之类的意思.个人以为翻译成解析更易懂,但parse已经是解析了,为了避免冲突,就只好保留了e ...
- Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?
译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...
- AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构
requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...
随机推荐
- Drools学习笔记-01-在eclipse indgo集成Drools5.5
1.1.条件 Drools它是一个基于Java开源规则引擎.因此,使用Drools以及前需要安装在开发机器JDK周边环境,Drools5.5需要JDK版本号的1.5或者更多. 1.2.开发环境搭建 大 ...
- jQuery中的getJSON()
json文件是一种轻量级的数据交互格式.一般在jQuery中使用getJSON()方法读取. $.getJSON(url,[data],[callback]) url:json文件地址 data:可选 ...
- HDU 1016 Prime Ring Problem 题解
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ... ...
- C++ 在字符串中插入子串+推断字符串是否由空格组成
// Example3.cpp : 定义控制台应用程序的入口点. #include "StdAfx.h" #include <string> #include < ...
- centos一些命令
1.查看系统使用端口并释放端口 [root@my_nn_01 WEB-INF]# lsof -w -n -i tcp:80 COMMAND PID USER FD TYPE DEVICE ...
- 开放搜索服务OpenSearch
开放搜索服务系统架构:从系统.平台到开放服务 搜索是各类网站和数据类APP的标配功能.目前开发者一般基于开源搜索系统,例如ElasticSearch.Solr.Sphinx等自己搭建搜索服务,系统定制 ...
- python学习笔记--for循环
推荐一个学习语言的网站:http://www.codecademy.com 有教程,可以边学边写,蛮不错的. for循环: 1.for loops allow us to iterate throug ...
- 简单的刷票系统(突破IP限制进行投票) (转)
前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了,不 ...
- boost事件处理
尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...
- URAL 1728. Curse on Team.GOV(STL set)
题目链接:space=1&num=1728" target="_blank">http://acm.timus.ru/problem.aspx?space= ...