博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
阅读量:5951 次
发布时间:2019-06-19

本文共 3258 字,大约阅读时间需要 10 分钟。

为何将单例模式移除

在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来创建帧图像,再通过帧图像来创建Spritecc.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 corecc.Configuration.getInstance()              --> cc.configurationcc.ShaderCache.getInstance()                --> cc.shaderCachecc.TextureCache.getInstance()               --> cc.textureCachecc.AnimationCache.getInstance()             --> cc.animationCachecc.SpriteFrameCache.getInstance()           --> cc.spriteFrameCachecc.Screen.getInstance()                     --> cc.screencc.TIFFReader.getInstance()                 --> cc.tiffReadercc.IMEDispatcher.getInstance()              --> cc.imeDispatcher// In extensionccs.GUIReader.getInstance()                 --> ccs.guiReaderccs.SceneReader.getInstance()               --> ccs.sceneReaderccs.DataReaderHelper                        --> ccs.dataReaderHelperccs.SpriteFrameCacheHelper.getInstance()    --> ccs.spriteFrameCacheHelperccs.ArmatureDataManager.getInstance()       --> ccs.armatureDataManagerccs.ActionManager.getInstance()             --> ccs.actionManagerccs.TriggerMng.getInstance()                --> ccs.triggerManagerccs.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.audioEnginecc.Director.getInstance()           --> cc.directorcc.EGLView.getInstance()            --> cc.viewcc.SAXParser.getInstance()          --> cc.saxParsercc.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开发人员们开发起来更加得心应手。

转载自:

你可能感兴趣的文章
oracle 管理操作 (转)
查看>>
DEV 等待窗口
查看>>
实验03博客园总结
查看>>
VS2017发布微服务到docker
查看>>
lombok
查看>>
Dev-FAT-UAT-PRO
查看>>
Maven, IntellJ Idea 配置注意点
查看>>
Android开发学习总结(五)——Android应用目录结构分析(转)
查看>>
观察者模式
查看>>
python操作excel (openpyxl)
查看>>
[PHP]PHP rpc框架hprose测试
查看>>
Atom 编辑器系列视频课程
查看>>
C#三种定时器
查看>>
范数 L1 L2
查看>>
协同过滤及大数据处理
查看>>
Java8 本地DateTime API
查看>>
jQuery 增加 删除 修改select option
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
springboot 常用插件
查看>>
一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...
查看>>