【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 中有什么命令_常用mysql命令大全

常用的MySQL命令大全连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码1、例1:连接到本机上的MYSQL。首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码&#xf…

Android之webview背景设置为透明无效

Adndroid 2.X的设置 webview是一个使用方便、功能强大的控件,但由于webview的背景颜色默认是白色,在一些场合下会显得很突兀(比如背景是黑色)。 此时就想到了要把webview的背景设置为透明,这样就可以与其背景融为一体…

linux系统的运行级别

linux 运行级别 0 停机1 单用户模式,用来维护系统。2.多用户不能使用NFS模式。3 多用户模式,也是主要的使用模式4 未定义5 窗口使用模式6 重新启动模式用init(0 1 2 3 4 5 6)切换运行级别,(init 3 切换到多用户模式)转…

C# WPF MVVM模式Prism框架从零搭建(经典)

01—前言目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码。Prism Github地址:https://github.com/PrismLibrary/PrismPrism官方文档:https://prismlibrary.com/docs/Prism要用到IOC容器&#xf…

在中国,有这样一些村落

全世界只有3.14 % 的人关注了爆炸吧知识01地坑村在河南有一个全球最神奇的村落这村子神奇就神奇在当你走进村子能听到家家户户的吵闹声却见不到一座房子原来村落居然建在地底下基本不用与外界接触但村子却被外国媒体争相报道火的一塌糊涂更不可思议的是村里的老人平均寿命都超1…

2-2

为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是取款,系统计算利息…

.NET 6新特性试用 | 隐式using指令

前言在使用《最小Web API》时,我们发现,相比以前的代码,大量的using指令消失了:using指令的主要作用是允许使用在命名空间中定义的类型,而无需指定该类型的完全限定命名空间。那么,在.NET 6下为什么不需要了…

mysql 导入文件夹_MySQL-导入与导出

CSV文件导入MySQLLOAD DATA INFILE语句允许您从文本文件读取数据,并将文件的数据快速导入数据库的表中。导入文件操作之前,需要准备以下内容:一、将要导入文件的数据对应的数据库表。二、准备好一个CSV文件,其数据与表的列数和每列…

Android之ButterKnife--View注入框架

俗话说:“不会偷懒的程序员不是好的程序员!”。作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从此从这些烦人臃肿的代码中解脱出来。先来看一段代码示例说明下ButterKnife…

设计模式 - Mediator

意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。…

6部有生之年必看的BBC “教材级” 地理纪录片,免费领取!

看BBC的纪录片,既可以追溯上下数千年的历史文化,也可以欣赏从宇宙到地心深处的奇妙境界,而及其超级精彩的画面即使定格,也是一幅摄影佳作。BBC纪录片题材广泛、制作精良,观看起来算的上是赏心悦目。对于学习英文&#…

Android之开发中用到的几个多线程解析

在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各有个的有点,Thread的运行速度是最快的,AsyncTask的规范性是最棒的,其它两个也有自己的优点,下面先贴…

blazor wasm开发chrome插件

用blazor(Wasm)开发了一个chrome插件感觉效率挺高的,分享给大家先简单介绍下WebAssembly的原理:“WebAssembly是一种用于基于堆栈的虚拟机的二进制指令格式”image如上图,浏览器在执行js时是会经历 Parser转成语法树->Compiler转成字节码-…

求偶的两种方法

import java.util.Scanner;public class Testif {public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scan new Scanner(System.in);System.out.println("请输入一个整数:");long number scan.nextLong(36);String check (numbe…

idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧

【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建【ZooKeeper系列】2.用Java实现ZooKeeper API的调用在系列的前两篇文章中,介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等场景用命令行的方式进行了测试&…

base target=_self是什么意思

<base target_blank>//在空白页打开 <base target_parent>//在当前页的上一页(父亲)打开 <base target_search>//在浏览器地址栏打开 <base target_self>//在当前页打开 <base target_top>//在最初(祖先)页打开 base 是地址 tar…

都才40出头,近一个月已有至少5名优秀青年学者英年早逝!健康不容忽视

全世界只有3.14 % 的人关注了爆炸吧知识近年来&#xff0c;在工作、生活的层层重压下&#xff0c;正处于事业上升期的科研人员因病逝世的消息屡屡传出。据不完全统计&#xff0c;仅仅今年10月份至今&#xff0c;短短一个多月时间里&#xff0c;已有至少5位优秀青年学者倒下。他…

基于 Spring Security 的开源统一角色访问控制系统 URACS

URACS Java语言开发的统一角色访问控制系统(Unified Role Access Control System)&#xff0c;基于Spring Security 3实现的权限控制系统 程序框架版本说明&#xff1a;Spring MVC 3.0.6 Spring Security 3.1.3 Hibernate 3.6.10 运行演示例子&#xff1a; 例子使用的是MySQL…

Chatopera 王海良:做好开源客服系统

| 作者&#xff1a;王海良| 编辑&#xff1a;刘雪洁| 设计&#xff1a;马丽娜| 责编&#xff1a;王玥敏做好开源客服系统&#xff0c;是我最近的心心念念的事情之一。我想讲的故事&#xff0c;就包括春松客服&#xff0c;一个开源的客服系统。篇章有限&#xff0c;我想从三点来…

Android之ANR异常及解决方法

ANR (Application Not Responding)   ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制…