【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
2016-01-02 17:26
531 查看
为何将单例模式移除
在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
相关文章推荐
- cocos2d-x 新建项目 Cannot open include file: ‘cocos2d.h’
- cocos2dx 音效 粒子 数据存储
- cocosjs+ccs花屏解决
- cocos2d-x学习笔记【三】添加精灵及相关操作
- cocos2d-x main.cpp源码详析 v2.26
- cocos2d-x开发环境搭建及工程创建命令(v2.26&&v3.9)
- 【cocos2d-x 3.x 学习与应用总结】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3
- cocos2dx 碰撞检测
- cocos2d-x学习笔记【二】导演、场景、层。精灵介绍
- cocos2dx-触摸事件
- cocos2d-x frameworks 和 cocos引擎的关系
- cocos2d-x CCNode类
- 通过ccb(CocosBuilder)文件生成cocos2dx代码
- cocos2d-x学习笔记【一】创建自己的场景类
- Cocos2dx 3.0 简单的动作类
- cocos2d-x 3.9 异步动态加载
- cocostduio Text 控件 添加监听无法响应
- Cocos Studio及ListView使用简介
- Cocosd使用骨骼动画Spine
- Cocos2d中动作详解