【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开发人员们开发起来更加得心应手。

转载自:http://www.cocos2dx.net/post/260

时间: 2024-08-01 20:46:54

【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象的相关文章

【cocos2d-js官方文档】十八、Cocos2d-JS v3.0中的属性风格API

1. 新的API风格 我们直接来看看你可以如何使用Cocos2d-JS v3.0: 以前的API 新的API node.setPosition(x, y); node.x = x; node.y = y; node.setRotation(r); node.rotation = r; 如表格中可以看到的,设置position属性的函数调用在3.0版中会被替换为直接的对象属性存取.不仅仅是示例中的x,y和rotation,几乎所有节点类型中关于属性存取的函数都会被替换为直接的对象属性访问.具体的属

【cocos2d-js官方文档】十八、Cocos2d-js v3.0的对象构造和类继承

在Cocos2d-JS中,对象的构造方式和Cocos2d-x一样,使用各个类的create函数来构造.在Cocos2d-JS v3.0我们还将为你带来一种传统的方式,即使用new操作符.另外,在v3.0 alpha1版本中,因为我们还没有找到较好的解决办法,所以不能继承JSB中的引擎类.但是在v3.0 alpha2中,这个问题已经解决了.由于使用new操作符,编写继承代码也更加容易了. 在这篇文档中,我们将会介绍如何使用它们,以及简要的实现原理. 1. 弃用的create函数 由于Cocos2d

【cocos2d-js官方文档】十五、cc.sys

概述 将原来的cc.Browser以及sys合并. 下面是api改造情况: //左侧是新api,右侧是旧api //常量 cc.sys.LANGUAGE_ENGLISH <-- cc.LANGUAGE_ENGLISH cc.sys.LANGUAGE_CHINESE <-- cc.LANGUAGE_CHINESE cc.sys.LANGUAGE_FRENCH <-- cc.LANGUAGE_FRENCH cc.sys.LANGUAGE_ITALIAN <-- cc.LANGUAGE_

ArcGIS API For JS官方文档解析教程

ArcGIS API For JavaScript(八)之Arcade ArcGIS API For JavaScript官方文档(一)之关于API ArcGIS API For JavaScript官方文档(一)之默认API配置 ArcGIS API For JavaScript官方文档(七)之编辑 ArcGIS API For Javascript官方文档(三)之从Web服务器取回数据 ArcGIS API For JavaScript官方文档(二)之默认的API字符串 ArcGIS API

【AutoMapper官方文档】DTO与Domin Model相互转换(中)

写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) 持续更新中... 本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containers-IoC容器 后记 随着AutoMapper的学习深入,发现AutoMapper在对

【cocos2d-js官方文档】十九、Cocos2d-JS单文件引擎使用指引

这篇指引主要介绍如何使用从在线下载工具下载下来的Cocos2d-JS的单文件引擎. 你有可能下载了下面三个版本中的一个: Cocos2d-JS Full Version: 完整版引擎包含Cocos2d-JS引擎的所有功能特性以及所有扩展,使用这个版本可以帮助你发掘Cocos2d-JS令人惊艳的创造力和可能性.你可以从官方文档首页中查看Cocos2d-JS所支持的特性列表. Cocos2d-JS Lite Version: 精简版本只包含Cocos2d-JS的核心特性,它的优势是稳定,轻量,简单易

比官方文档更易懂的Vue.js教程!包你学会!

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. 2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时候不吹上一点新技术,好像自己就不是搞前端的似的.当然,

Spring 4 官方文档学习(五)核心技术之SpEL

1.介绍 SpEL支持在runtime 查询.操作对象图. 2.功能概览 英文 中文 Literal expressions 字面值表达式 Boolean and relational operators 布尔和关系操作符 Regular expressions  正则表达式 Class expressions 类表达式 Accessing properties, arrays, lists, maps 访问properties.arrays.lists.maps Method invocati

【cocos2d-js官方文档】十三、CCSAXParser.js

cc.saxParser 将cc.SAXParser重构为单例对象:cc.saxParser 删除了tmxParse,preloadPlist,unloadPlist,getName,getExt, getList等方法. Parser的统一入口函数规范为parse,并且传参内容即为需要解析的文本内容. cc.plistParser 添加了cc.plistParser.cc.plistParser继承cc.saxParser,用于解析plist文本内容. 这样的改造是为了让Parser的职责更加