【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
【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象相关推荐
- ABP官方文档(四十五)【集成Hangfire】
7.2 ABP后台服务 - 集成Hangfire 7.2.1 简介 Hangfire是一个综合性的后台作业管理工具.你可以用Hangfire来替换ABP中默认实现的后台作业管理者.你可以对Hangfi ...
- ESP32 官方文档(十五)ESP-MESH
ESP-MESH ESP-MESH 概述 简介 ESP-MESH概念 术语 树状网络拓扑结构 节点类型 信标帧(Beacon 帧)和 RSSI 阈值 首选父节点 路由表 构建 ESP-MESH 网络 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- Unity 优化翻译官方文档(二) ------ 平台特定覆盖的纹理压缩格式
官方文档 : https://docs.unity3d.com/Manual/class-TextureImporterOverride.html 虽然Unity支持许多常见的图像格式作为导入纹理的源 ...
- 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手
本文转载自机器之心. 项目作者:lyhue1991 「官方文档排布凌乱.搜索难用.API 丑陋不堪--」这是很多人对 TensorFlow 官方文档的吐槽.但吐槽归吐槽,到了工业界,你是无论如何也绕不 ...
- Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?
译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...
- ABP官方文档(四十四)【后台作业和后台工人】
7.1 ABP后台服务 - 后台作业和后台工人 7.1.1 简介 ABP提供了后台作业和后台工人,来执行应用程序中的后台线程的某些任务. 7.1.2 后台作业 由于各种各样的原因,你需要后台作业以队列 ...
- Nginx官方文档(三十二)【ngx_http_slice_module|ngx_http_spdy_module】
ngx_http_slice_module 示例配置 指令 slice 内嵌变量 ngx_http_slice_module 模块(1.9.8)是一个过滤器,它将请求拆分为子请求,每个子请求都返回一定 ...
- GO.js官方文档中文版
GoJs是一个实现图表交互的javaScript库,这篇文章将为你展示使用GoJs时的特征.因为GoJs是依赖hTML5的javaScript库,所以你要确认你开发的页面是在HTML技术的基础上,当然 ...
最新文章
- 【从零开始的ROS四轴机械臂控制】(二) - ROS与Gazebo连接,Gazebo仿真及urdf文件修改
- 看你的样子对Vue研究挺深的,我司招Vue,五险一金有兴趣吗?
- 计算机机械应用,浅析计算机技术在机械自动化的应用(原稿)
- Springboot 解决跨域的四种姿势
- .gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名
- 计算机键盘大赛活动总结,参加技能大赛的活动总结
- C++string基本概念
- CodeGym—Java自学神器
- Linux系统可视化界面与Shell界面切换
- 《缠中说禅108课》58:图解分析示范三
- iVMS-4200 Vs区别_菲尔·杰克逊揭示了迈克尔·乔丹和科比·布莱恩特之间的关键区别...
- Chrome 浏览器下载速度慢?一个开关就可解决
- 微信如何屏蔽别人发来的消息,如何屏蔽微信消息
- SmartRefreshLayout 下拉刷新上拉加载框架
- 时序分析基本概念介绍Timing Derate
- 意语口语学习:意大利语的发音
- cs,ds,ss,es?即cs,ds,ss,es的区别
- SpringBoot配置文件中spring.profiles.active配置详解
- 基于FPGA的flash分区实现多功能转换(icap核)
- Zip压缩包伪加密原理
热门文章
- 设计和实现一个 Chrome 插件提升登录效率
- 前端工程师的一大神器——puppeteer
- erlang-17版本的编码方式
- as3文本框的动态拖拽和编辑
- 使用string.Format需要注意的一个性能问题
- SQL2K数据库开发十五之表操作查看表中的数据
- .NET设计模式(7):创建型模式专题总结(Creational Pattern)
- [music]Canon and Gigue in D major
- swiper移入暂停_react中swiper注意事项及鼠标划入停止轮播
- exfat分配单元大小选多少_安防监控摄像机视角大小和镜头毫米数的基础知识!...