【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。这篇文档中将要展示的是单例类的改造。拿 // 在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.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 请留意所有单例对象都是以首字母小写来命名的,这是为了区分一个变量名代表的是类还是对象。 另外, 结果重构之后,文档最初的例子在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |