javascript
【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
為何將單例模式移除
在Cocos2d-JS v3.0之前。全部API差點(diǎn)兒都是從Cocos2d-x中移植過(guò)來(lái)的,這是Cocos2d生態(tài)圈統(tǒng)一性的重要一環(huán)。可惜的是,這樣的統(tǒng)一性也在非常大程度上限制了Cocos2d-html5的發(fā)展,有一些在C++中非常有意義的涉及搬到Html5平臺(tái)后卻使得Cocos2d-html5變得臃腫。所以在3.0版中,我們決定將一些API改造成更適合JavaScript開發(fā)者的API。這篇文檔中將要展示的是單例類的改造。
拿cc.SpriteFrameCache為例:
// 在2.2.2版中。假設(shè)我們想通過(guò)cc.SpriteFrameCache來(lái)創(chuàng)建幀圖像,再通過(guò)幀圖像來(lái)創(chuàng)建Sprite cc.SpriteFrameCache.getInstance().addSpriteFrames(s_boxs_plist); var boxFrame = cc.SpriteFrameCache.getInstance().getSpriteFrame("box_normal_00.png"); var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);首先,這種代碼非常長(zhǎng)而且較難閱讀。其次,不論cc.SpriteFrameCache的單例對(duì)象是否被創(chuàng)建。獲取它都將產(chǎn)生函數(shù)調(diào)用。假設(shè)開發(fā)人員們不夠注意。使用它載入非常多幀圖像而且創(chuàng)建非常多精靈又不緩存cc.SpriteFrameCache的單例對(duì)象,那么在javascript上必定造成一定程度的性能損失。
最后。也是最重要的是。單例設(shè)計(jì)模式是為了保護(hù)類的單例對(duì)象,防止用戶反復(fù)創(chuàng)建其對(duì)象。只是作為javascript開發(fā)人員我們都知道。這沒(méi)什么意義:
// 我們能夠非常easy得獲取`cc.SpriteFrameCache`的實(shí)際單例對(duì)象 cc.s_sharedSpriteFrameCache.addSpriteFrames(s_boxs_plist); // 假設(shè)我們想,我們也能夠創(chuàng)建還有一個(gè)精靈幀緩存對(duì)象 var myCache = new cc.SpriteFrameCache();因此,我們決定Cocos2d-JS v3.0的首要任務(wù)就是提供一套更精簡(jiǎn)更符合JavaScript代碼風(fēng)格的API,這也是重構(gòu)單例類的好機(jī)會(huì)。
重構(gòu)列表
v3.0中部分被重構(gòu)的單例類例如以下 :
// 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中變成了純對(duì)象。類似以下的實(shí)現(xiàn):
cc.screen = {init: function () {//...},fullScreen: function() {//...},requestFullScreen: function (element, onFullScreenChange) {//...},exitFullScreen: function () {//...},autoFullScreen: function (element, onFullScreenChange) {//...} };還有一方面,當(dāng)我們須要繼承和擴(kuò)展時(shí),作為類本身對(duì)于結(jié)構(gòu)可能是非常有裨益的,所以并非全部的單例類都適合被重構(gòu)為對(duì)象。
可是我們又希望提供給開發(fā)人員統(tǒng)一的API風(fēng)格,所以我們保留了部分類的類實(shí)現(xiàn)而且直接提供了它的單例對(duì)象,下面這些類在3.0版中是這樣實(shí)現(xiàn)的:
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請(qǐng)留意全部單例對(duì)象都是以首字母小寫來(lái)命名的。這是為了區(qū)分一個(gè)變量名代表的是類還是對(duì)象。
另外。cc.EGLView是最早在Cocos2d-iPhone中被定義的,所以它的名字來(lái)源于iOS中的OpenGL ES視圖的名字。可是在Cocos2d-JS中。它不過(guò)游戲的視圖,能夠是WebGL或OpenGL視圖但同一時(shí)候也可能是Canvas視圖,所以我們決定將它重命名為cc.view。
結(jié)果
重構(gòu)之后,文檔最初的樣例在v3.0中將如以下代碼所看到的:
cc.spriteFrameCache.addSpriteFrames(s_boxs_plist); var boxFrame = cc.spriteFrameCache.getSpriteFrame("box_normal_00.png"); var sprite = cc.Sprite.createWithSpriteFrame(boxFrame);我們衷心希望這樣的新的API風(fēng)格能夠讓JavaScript開發(fā)人員們開發(fā)起來(lái)更加得心應(yīng)手。
轉(zhuǎn)載自:http://www.cocos2dx.net/post/260
總結(jié)
以上是生活随笔為你收集整理的【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js与jsp
- 下一篇: gradle idea java ssm