From 81cceea44031d393dfdc3c657cd3e5de5f56f555 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Tue, 26 Jul 2016 11:00:42 +0800 Subject: [PATCH 01/16] Asynchronous loading texture --- cocos2d/core/event-manager/CCEventHelper.js | 22 ++- cocos2d/core/sprites/CCSprite.js | 50 +++++-- cocos2d/core/textures/CCTexture2D.js | 2 +- cocos2d/core/textures/TexturesWebGL.js | 2 +- .../ccui/base-classes/UIScale9Sprite.js | 128 +++++++++--------- extensions/ccui/uiwidgets/UIButton.js | 23 ++-- 6 files changed, 130 insertions(+), 97 deletions(-) diff --git a/cocos2d/core/event-manager/CCEventHelper.js b/cocos2d/core/event-manager/CCEventHelper.js index 3e5e227f84..a7f952dc94 100644 --- a/cocos2d/core/event-manager/CCEventHelper.js +++ b/cocos2d/core/event-manager/CCEventHelper.js @@ -71,12 +71,32 @@ cc.EventHelper.prototype = { return false; }, - removeEventListener: function( type, target){ + removeEventListener: function( type, listener){ if ( this._listeners === undefined ) return; var listeners = this._listeners; var listenerArray = listeners[ type ]; + if (!listenerArray) return; + + if ( listenerArray !== undefined ) { + for(var i = 0; i < listenerArray.length ; ){ + var selListener = listenerArray[i]; + if(selListener.callback === listener) + listenerArray.splice( i, 1 ); + else + i++ + } + } + }, + + removeEventTarget: function( type, listener, target){ + if ( this._listeners === undefined ) + return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + if (!listenerArray) return; if ( listenerArray !== undefined ) { for(var i = 0; i < listenerArray.length ; ){ diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index 1b664b8d79..be7c3ba36e 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -123,6 +123,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ ctor: function (fileName, rect, rotated) { var self = this; cc.Node.prototype.ctor.call(self); + self._loader = new cc.Sprite.loadManager(self); self._shouldBeHidden = false; self._offsetPosition = cc.p(0, 0); self._unflippedOffsetPositionFromCenter = cc.p(0, 0); @@ -246,11 +247,11 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ */ initWithSpriteFrame:function (spriteFrame) { cc.assert(spriteFrame, cc._LogInfos.Sprite_initWithSpriteFrame); - + this._loader.clear(); if(!spriteFrame.textureLoaded()){ //add event listener this._textureLoaded = false; - spriteFrame.addEventListener("load", this._renderCmd._spriteFrameLoadedCallback, this); + this._loader.add(spriteFrame, this._renderCmd._spriteFrameLoadedCallback, this); } //TODO @@ -669,6 +670,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ initWithTexture: function (texture, rect, rotated, counterclockwise) { var _t = this; cc.assert(arguments.length !== 0, cc._LogInfos.CCSpriteBatchNode_initWithTexture); + this._loader.clear(); rotated = rotated || false; texture = this._renderCmd._handleTextureForRotatedTexture(texture, rect, rotated, counterclockwise); @@ -705,9 +707,8 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ _t._rect.width = rect.width; _t._rect.height = rect.height; } - if(_t.texture) - _t.texture.removeEventListener("load", _t); - texture.addEventListener("load", _t._renderCmd._textureLoadedCallback, _t); + + this._loader.add(texture, _t._renderCmd._textureLoadedCallback, _t); _t.setTexture(texture); return true; } @@ -789,6 +790,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ newFrame = cc.spriteFrameCache.getSpriteFrame(newFrame); cc.assert(newFrame, cc._LogInfos.Sprite_setSpriteFrame) } + this._loader.clear(); this.setNodeDirty(true); @@ -801,7 +803,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ var locTextureLoaded = newFrame.textureLoaded(); if (!locTextureLoaded) { _t._textureLoaded = false; - newFrame.addEventListener("load", function (sender) { + this._loader.add(newFrame, function (sender) { _t.setNodeDirty(true); _t._textureLoaded = true; var locNewTexture = sender.getTexture(); @@ -898,6 +900,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ * @param {cc.Texture2D|String} texture */ setTexture: function (texture) { + this._loader.clear(); if(!texture) return this._renderCmd._setTexture(null); @@ -913,12 +916,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ this._textureLoaded = true; }else{ this._renderCmd._setTexture(null); - texture.addEventListener("load", function(){ - this.setNodeDirty(true); - this._setTexture(texture, isFileName); - this.setColor(this._realColor); - this._textureLoaded = true; - }, this); + this._loader.add(texture, this._renderCmd._textureLoadedCallback, this); } }, @@ -931,9 +929,9 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ _changeRectWithTexture: function(texture){ var contentSize = texture._contentSize; var rect = cc.rect( - 0, 0, - contentSize.width, contentSize.height - ); + 0, 0, + contentSize.width, contentSize.height + ); this.setTextureRect(rect); }, @@ -990,3 +988,25 @@ cc.EventHelper.prototype.apply(cc.Sprite.prototype); cc.assert(cc.isFunction(cc._tmp.PrototypeSprite), cc._LogInfos.MissingFile, "SpritesPropertyDefine.js"); cc._tmp.PrototypeSprite(); delete cc._tmp.PrototypeSprite; + +(function () { + var manager = cc.Sprite.loadManager = function (target) { + this.target = target; + this.list = []; + }; + + manager.prototype.add = function (source, callback, target) { + source.addEventListener('load', callback, target); + this.list.push({ + source: source, + listener: callback, + target: target + }); + }; + manager.prototype.clear = function () { + while (this.list.length > 0) { + var item = this.list.pop(); + item.source.removeEventListener('load', item.listener, item.target); + } + }; +})(); \ No newline at end of file diff --git a/cocos2d/core/textures/CCTexture2D.js b/cocos2d/core/textures/CCTexture2D.js index 9cbf90e222..b772532ae1 100644 --- a/cocos2d/core/textures/CCTexture2D.js +++ b/cocos2d/core/textures/CCTexture2D.js @@ -380,7 +380,7 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () { * @param {cc.Node} target */ removeLoadedEventListener: function (target) { - this.removeEventListener("load", target); + this.removeEventTarget("load", target); }, _generateColorTexture: function(){/*overide*/}, diff --git a/cocos2d/core/textures/TexturesWebGL.js b/cocos2d/core/textures/TexturesWebGL.js index dc92de6636..cf6a2555de 100644 --- a/cocos2d/core/textures/TexturesWebGL.js +++ b/cocos2d/core/textures/TexturesWebGL.js @@ -773,7 +773,7 @@ cc._tmp.WebGLTexture2D = function () { * @param {cc.Node} target */ removeLoadedEventListener: function (target) { - this.removeEventListener("load", target); + this.removeEventTarget("load", target); } }); }; diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index b8b6f2fbfc..09e3a02af1 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -312,6 +312,10 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit setCapInsets: function (capInsets) { var contentSize = this._contentSize; var tempWidth = contentSize.width, tempHeight = contentSize.height; + this._capInsets.x = capInsets.x; + this._capInsets.y = capInsets.y; + this._capInsets.width = capInsets.width; + this._capInsets.height = capInsets.height; this.updateWithSprite( this._scale9Image, this._spriteRect, @@ -440,13 +444,15 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit * @returns {boolean} */ initWithBatchNode: function (batchNode, rect, rotated, capInsets) { + if (!batchNode) + return false; + if (capInsets === undefined) { capInsets = rotated; rotated = false; } - if (batchNode) - this.updateWithBatchNode(batchNode, rect, rotated, capInsets); + this.updateWithBatchNode(batchNode, rect, rotated, capInsets); this.setCascadeColorEnabled(true); this.setCascadeOpacityEnabled(true); @@ -523,27 +529,29 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit throw new Error("ccui.Scale9Sprite.initWithSpriteFrame(): spriteFrame should be non-null and its texture should be non-null"); capInsets = capInsets || cc.rect(0, 0, 0, 0); - var locLoaded = spriteFrame.textureLoaded(); - this._textureLoaded = locLoaded; - if(!locLoaded){ - spriteFrame.addEventListener("load", function(sender){ - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } - this.updateWithBatchNode(this._scale9Image, sender.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && sender.isRotated(), this._capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; - this.setNodeDirty(); + + var texture = spriteFrame.getTexture(); + var loaded = texture.loaded; + + if (loaded) { + var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); + // the texture is rotated on Canvas render mode, so isRotated always is false. + this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), capInsets); + } else { + this._capInsets.x = capInsets.x; + this._capInsets.y = capInsets.y; + this._capInsets.width = capInsets.width; + this._capInsets.height = capInsets.height; + var textureCallback = function () { + var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); + // the texture is rotated on Canvas render mode, so isRotated always is false. + this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), this._capInsets); this.dispatchEvent("load"); - },this); + }; + texture.addEventListener('load', textureCallback, this); } - var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); - // the texture is rotated on Canvas render mode, so isRotated always is false. - return this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), capInsets); + + return true; }, /** @@ -710,11 +718,11 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var t = cc.affineTransformMakeIdentity(); if (!rotated) { t = cc.affineTransformTranslate(t, rect.x, rect.y); - + rotatedLeftTopBoundsOriginal = cc.rectApplyAffineTransform(rotatedLeftTopBoundsOriginal, t); rotatedCenterBoundsOriginal = cc.rectApplyAffineTransform(rotatedCenterBoundsOriginal, t); rotatedRightBottomBoundsOriginal = cc.rectApplyAffineTransform(rotatedRightBottomBoundsOriginal, t); - + rotatedCenterBounds = cc.rectApplyAffineTransform(rotatedCenterBounds, t); rotatedRightBottomBounds = cc.rectApplyAffineTransform(rotatedRightBottomBounds, t); rotatedLeftBottomBounds = cc.rectApplyAffineTransform(rotatedLeftBottomBounds, t); @@ -728,11 +736,11 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit } else { t = cc.affineTransformTranslate(t, rect.height + rect.x, rect.y); t = cc.affineTransformRotate(t, 1.57079633); - + leftTopBoundsOriginal = cc.rectApplyAffineTransform(leftTopBoundsOriginal, t); centerBoundsOriginal = cc.rectApplyAffineTransform(centerBoundsOriginal, t); rightBottomBoundsOriginal = cc.rectApplyAffineTransform(rightBottomBoundsOriginal, t); - + centerBounds = cc.rectApplyAffineTransform(centerBounds, t); rightBottomBounds = cc.rectApplyAffineTransform(rightBottomBounds, t); leftBottomBounds = cc.rectApplyAffineTransform(leftBottomBounds, t); @@ -742,11 +750,11 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit leftCenterBounds = cc.rectApplyAffineTransform(leftCenterBounds, t); centerBottomBounds = cc.rectApplyAffineTransform(centerBottomBounds, t); centerTopBounds = cc.rectApplyAffineTransform(centerTopBounds, t); - + rotatedLeftTopBoundsOriginal.x = leftTopBoundsOriginal.x; rotatedCenterBoundsOriginal.x = centerBoundsOriginal.x; rotatedRightBottomBoundsOriginal.x = rightBottomBoundsOriginal.x; - + rotatedCenterBounds.x = centerBounds.x; rotatedRightBottomBounds.x = rightBottomBounds.x; rotatedLeftBottomBounds.x = leftBottomBounds.x; @@ -756,12 +764,12 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit rotatedLeftCenterBounds.x = leftCenterBounds.x; rotatedCenterBottomBounds.x = centerBottomBounds.x; rotatedCenterTopBounds.x = centerTopBounds.x; - - + + rotatedLeftTopBoundsOriginal.y = leftTopBoundsOriginal.y; rotatedCenterBoundsOriginal.y = centerBoundsOriginal.y; rotatedRightBottomBoundsOriginal.y = rightBottomBoundsOriginal.y; - + rotatedCenterBounds.y = centerBounds.y; rotatedRightBottomBounds.y = rightBottomBounds.y; rotatedLeftBottomBounds.y = leftBottomBounds.y; @@ -840,49 +848,30 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit * @brief Update Scale9Sprite with a specified sprite. * * @param sprite A sprite pointer. - * @param rect A delimitation zone. - * @param rotated Whether the sprite is rotated or not. + * @param spriteRect A delimitation zone. + * @param spriteFrameRotated Whether the sprite is rotated or not. * @param offset The offset when slice the sprite. * @param originalSize The origial size of the sprite. * @param capInsets The Values to use for the cap insets. * @return True if update success, false otherwise. */ updateWithSprite: function(sprite, spriteRect, spriteFrameRotated, offset, originalSize, capInsets) { + if (!sprite || !sprite.getSpriteFrame()) { + return false; + } + + this._scale9Image = sprite; + if(!this._scale9Image) return false; + var opacity = this.getOpacity(); var color = this.getColor(); this._renderers.length = 0; - if(sprite) { - if(!sprite.getSpriteFrame()) - return false; - if(!this._scale9Image) - this._scale9Image = sprite; - } - if(!this._scale9Image) return false; var rect = spriteRect; var size = originalSize; var tmpTexture = this._scale9Image.getTexture(); - var locLoaded = tmpTexture && tmpTexture.isLoaded(); - this._textureLoaded = locLoaded; - if(!locLoaded){ - tmpTexture.addEventListener("load", function(sender){ - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } - this.updateWithSprite(sprite, spriteRect, spriteFrameRotated, offset, originalSize, capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; - this.setVisible(true); - this.setNodeDirty(); - this.dispatchEvent("load"); - }, this); - this.setVisible(false); - return true; - } + this._textureLoaded = tmpTexture && tmpTexture.isLoaded(); + if(cc._rectEqualToZero(rect)) { var textureSize = tmpTexture.getContentSize(); rect = cc.rect(0, 0, textureSize.width, textureSize.height); @@ -922,16 +911,23 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit if (!batchNode) { return false; } + + this._capInsets.x = capInsets.x; + this._capInsets.y = capInsets.y; + this._capInsets.width = capInsets.width; + this._capInsets.height = capInsets.height; + var sprite = new cc.Sprite(batchNode.getTexture()); var pos = cc.p(0,0); var originalSize = cc.size(originalRect.width,originalRect.height); var tmpTexture = batchNode.getTexture(); - var locLoaded = tmpTexture.isLoaded(); - this._textureLoaded = locLoaded; - if(!locLoaded){ + var loaded = this._textureLoaded = tmpTexture.isLoaded(); + if (loaded) { + return this.updateWithSprite(sprite, originalRect, rotated, pos, originalSize, capInsets); + } else { tmpTexture.addEventListener("load", function(sender){ - var preferredSize = this._preferredSize, + var preferredSize = this._preferredSize, restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; if (restorePreferredSize) { preferredSize = cc.size(preferredSize.width, preferredSize.height); @@ -946,9 +942,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this.dispatchEvent("load"); }, this); this.setVisible(false); - return true; } - return this.updateWithSprite(sprite, originalRect, rotated, pos, originalSize, capInsets); }, /** @@ -965,7 +959,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._textureLoaded = locLoaded; if(!locLoaded){ spriteFrame.addEventListener("load", function(sender){ - var preferredSize = this._preferredSize, + var preferredSize = this._preferredSize, restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; if (restorePreferredSize) { preferredSize = cc.size(preferredSize.width, preferredSize.height); diff --git a/extensions/ccui/uiwidgets/UIButton.js b/extensions/ccui/uiwidgets/UIButton.js index 6bb7582e2e..81f6a2b5f1 100644 --- a/extensions/ccui/uiwidgets/UIButton.js +++ b/extensions/ccui/uiwidgets/UIButton.js @@ -233,19 +233,13 @@ ccui.Button = ccui.Widget.extend(/** @lends ccui.Button# */{ * @param {ccui.Widget.LOCAL_TEXTURE|ccui.Widget.PLIST_TEXTURE} texType */ loadTextureNormal: function (normal, texType) { - if (!normal) - return; + if (!normal) return; + texType = texType || ccui.Widget.LOCAL_TEXTURE; this._normalFileName = normal; this._normalTexType = texType; - var self = this; var normalRenderer = this._buttonNormalRenderer; - if(!normalRenderer._textureLoaded){ - normalRenderer.addEventListener("load", function(){ - self.loadTextureNormal(self._normalFileName, self._normalTexType); - }); - } switch (this._normalTexType){ case ccui.Widget.LOCAL_TEXTURE: //SetTexture cannot load resource @@ -258,14 +252,19 @@ ccui.Button = ccui.Widget.extend(/** @lends ccui.Button# */{ default: break; } - - this._normalTextureLoaded = normalRenderer._textureLoaded; - + var loaded = normalRenderer._textureLoaded; + normalRenderer.removeEventListener('load', this._loadNormalTextureCallback); + normalRenderer.addEventListener('load', this._loadNormalTextureCallback, this); + if (loaded) { + this._loadNormalTextureCallback(); + } + }, + _loadNormalTextureCallback: function () { this._normalTextureSize = this._buttonNormalRenderer.getContentSize(); this._updateChildrenDisplayedRGBA(); if (this._unifySize){ if (this._scale9Enabled){ - normalRenderer.setCapInsets(this._capInsetsNormal); + this._buttonNormalRenderer.setCapInsets(this._capInsetsNormal); this._updateContentSizeWithTextureSize(this._getNormalSize()); } }else From a22afda38c42099173c329a734539af1cf3ce6a9 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Fri, 5 Aug 2016 17:07:22 +0800 Subject: [PATCH 02/16] Asynchronous loading texture --- .../ccui/base-classes/UIScale9Sprite.js | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index 09e3a02af1..5190e7c8f1 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -214,6 +214,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit */ ctor: function (file, rectOrCapInsets, capInsets) { cc.Node.prototype.ctor.call(this); + this._loader = new cc.Sprite.loadManager(this); this._spriteRect = cc.rect(0, 0, 0, 0); this._capInsetsInternal = cc.rect(0, 0, 0, 0); @@ -493,8 +494,9 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var locLoaded = texture.isLoaded(); this._textureLoaded = locLoaded; + this._loader.clear(); if(!locLoaded){ - texture.addEventListener("load", function(sender){ + this._loader.add(texture, function(sender){ var preferredSize = this._preferredSize, restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; if (restorePreferredSize) { @@ -533,6 +535,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var texture = spriteFrame.getTexture(); var loaded = texture.loaded; + this._loader.clear(); if (loaded) { var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); // the texture is rotated on Canvas render mode, so isRotated always is false. @@ -543,12 +546,21 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._capInsets.width = capInsets.width; this._capInsets.height = capInsets.height; var textureCallback = function () { + var preferredSize = this._preferredSize, + restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; + if (restorePreferredSize) { + preferredSize = cc.size(preferredSize.width, preferredSize.height); + } var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); // the texture is rotated on Canvas render mode, so isRotated always is false. this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), this._capInsets); + if (restorePreferredSize) { + this.setPreferredSize(preferredSize); + } + this._positionsAreDirty = true; this.dispatchEvent("load"); }; - texture.addEventListener('load', textureCallback, this); + this._loader.add(texture, textureCallback, this); } return true; @@ -921,12 +933,13 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var pos = cc.p(0,0); var originalSize = cc.size(originalRect.width,originalRect.height); + this._loader.clear(); var tmpTexture = batchNode.getTexture(); var loaded = this._textureLoaded = tmpTexture.isLoaded(); if (loaded) { return this.updateWithSprite(sprite, originalRect, rotated, pos, originalSize, capInsets); } else { - tmpTexture.addEventListener("load", function(sender){ + this._loader.add(tmpTexture, function(sender){ var preferredSize = this._preferredSize, restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; if (restorePreferredSize) { @@ -957,8 +970,9 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var sprite = new cc.Sprite(spriteFrame.getTexture()); var locLoaded = spriteFrame.textureLoaded(); this._textureLoaded = locLoaded; + this._loader.clear(); if(!locLoaded){ - spriteFrame.addEventListener("load", function(sender){ + this._loader.add(spriteFrame, function(sender){ var preferredSize = this._preferredSize, restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; if (restorePreferredSize) { From bade37a2e393afca7d7450cb62e1462faddbadb6 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Fri, 5 Aug 2016 17:19:46 +0800 Subject: [PATCH 03/16] pandamicro review code --- cocos2d/core/event-manager/CCEventHelper.js | 2 -- cocos2d/core/sprites/CCSprite.js | 12 ++++++++---- extensions/ccui/base-classes/UIScale9Sprite.js | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/cocos2d/core/event-manager/CCEventHelper.js b/cocos2d/core/event-manager/CCEventHelper.js index a7f952dc94..3146254077 100644 --- a/cocos2d/core/event-manager/CCEventHelper.js +++ b/cocos2d/core/event-manager/CCEventHelper.js @@ -77,7 +77,6 @@ cc.EventHelper.prototype = { var listeners = this._listeners; var listenerArray = listeners[ type ]; - if (!listenerArray) return; if ( listenerArray !== undefined ) { for(var i = 0; i < listenerArray.length ; ){ @@ -96,7 +95,6 @@ cc.EventHelper.prototype = { var listeners = this._listeners; var listenerArray = listeners[ type ]; - if (!listenerArray) return; if ( listenerArray !== undefined ) { for(var i = 0; i < listenerArray.length ; ){ diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index be7c3ba36e..78cbb9efda 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -123,7 +123,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ ctor: function (fileName, rect, rotated) { var self = this; cc.Node.prototype.ctor.call(self); - self._loader = new cc.Sprite.loadManager(self); + self._loader = new cc.Sprite.LoadManager(); self._shouldBeHidden = false; self._offsetPosition = cc.p(0, 0); self._unflippedOffsetPositionFromCenter = cc.p(0, 0); @@ -916,7 +916,12 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ this._textureLoaded = true; }else{ this._renderCmd._setTexture(null); - this._loader.add(texture, this._renderCmd._textureLoadedCallback, this); + this._loader.add(texture, function () { + this.setNodeDirty(true); + this._setTexture(texture, isFileName); + this.setColor(this._realColor); + this._textureLoaded = true; + }, this); } }, @@ -990,8 +995,7 @@ cc._tmp.PrototypeSprite(); delete cc._tmp.PrototypeSprite; (function () { - var manager = cc.Sprite.loadManager = function (target) { - this.target = target; + var manager = cc.Sprite.LoadManager = function () { this.list = []; }; diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index 5190e7c8f1..35d601c3f4 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -214,7 +214,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit */ ctor: function (file, rectOrCapInsets, capInsets) { cc.Node.prototype.ctor.call(this); - this._loader = new cc.Sprite.loadManager(this); + this._loader = new cc.Sprite.LoadManager(); this._spriteRect = cc.rect(0, 0, 0, 0); this._capInsetsInternal = cc.rect(0, 0, 0, 0); @@ -313,6 +313,8 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit setCapInsets: function (capInsets) { var contentSize = this._contentSize; var tempWidth = contentSize.width, tempHeight = contentSize.height; + // Asynchronous loading texture requires this data + // This data does not take effect immediately, so it does not affect the existing texture. this._capInsets.x = capInsets.x; this._capInsets.y = capInsets.y; this._capInsets.width = capInsets.width; From fbb3d0453d4054818ebf8286943c2d691d8b8f37 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Fri, 5 Aug 2016 17:24:53 +0800 Subject: [PATCH 04/16] Asynchronous loading texture --- cocos2d/core/sprites/CCSprite.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index 78cbb9efda..43a5c190a9 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -916,12 +916,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ this._textureLoaded = true; }else{ this._renderCmd._setTexture(null); - this._loader.add(texture, function () { - this.setNodeDirty(true); - this._setTexture(texture, isFileName); - this.setColor(this._realColor); - this._textureLoaded = true; - }, this); + this._loader.add(texture, this._renderCmd._textureLoadedCallback, this); } }, From 42494a40046e8ac27557a384a23f923076898b6e Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Mon, 8 Aug 2016 15:27:34 +0800 Subject: [PATCH 05/16] Target must be the same --- cocos2d/core/event-manager/CCEventHelper.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cocos2d/core/event-manager/CCEventHelper.js b/cocos2d/core/event-manager/CCEventHelper.js index 3146254077..bd4198f23a 100644 --- a/cocos2d/core/event-manager/CCEventHelper.js +++ b/cocos2d/core/event-manager/CCEventHelper.js @@ -71,7 +71,7 @@ cc.EventHelper.prototype = { return false; }, - removeEventListener: function( type, listener){ + removeEventListener: function( type, listener, target){ if ( this._listeners === undefined ) return; @@ -81,7 +81,7 @@ cc.EventHelper.prototype = { if ( listenerArray !== undefined ) { for(var i = 0; i < listenerArray.length ; ){ var selListener = listenerArray[i]; - if(selListener.callback === listener) + if(selListener.eventTarget === target && selListener.callback === listener) listenerArray.splice( i, 1 ); else i++ From b5c96452c201cca1a3a1e30f81500f4aa67fafcf Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Wed, 10 Aug 2016 09:44:17 +0800 Subject: [PATCH 06/16] texture.isLoaded().... --- extensions/ccui/base-classes/UIScale9Sprite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index 35d601c3f4..0f2a8c98c6 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -535,7 +535,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit capInsets = capInsets || cc.rect(0, 0, 0, 0); var texture = spriteFrame.getTexture(); - var loaded = texture.loaded; + var loaded = texture.isLoaded(); this._loader.clear(); if (loaded) { From 15d00e30518a13dee03068df9881579d524cab89 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Mon, 15 Aug 2016 14:20:37 +0800 Subject: [PATCH 07/16] Simplify sprite asynchronous callback logic --- cocos2d/core/sprites/CCSprite.js | 123 ++++++++---------- .../core/sprites/CCSpriteCanvasRenderCmd.js | 20 --- .../core/sprites/CCSpriteWebGLRenderCmd.js | 9 +- 3 files changed, 55 insertions(+), 97 deletions(-) diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index 43a5c190a9..e504c9f26e 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -247,19 +247,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ */ initWithSpriteFrame:function (spriteFrame) { cc.assert(spriteFrame, cc._LogInfos.Sprite_initWithSpriteFrame); - this._loader.clear(); - if(!spriteFrame.textureLoaded()){ - //add event listener - this._textureLoaded = false; - this._loader.add(spriteFrame, this._renderCmd._spriteFrameLoadedCallback, this); - } - - //TODO - var rotated = cc._renderType === cc.game.RENDER_TYPE_CANVAS ? false : spriteFrame._rotated; - var ret = this.initWithTexture(spriteFrame.getTexture(), spriteFrame.getRect(), rotated); - this.setSpriteFrame(spriteFrame); - - return ret; + return this.setSpriteFrame(spriteFrame); }, /** @@ -646,14 +634,21 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ var tex = cc.textureCache.getTextureForKey(filename); if (!tex) { tex = cc.textureCache.addImage(filename); - return this.initWithTexture(tex, rect || cc.rect(0, 0, tex._contentSize.width, tex._contentSize.height)); - } else { - if (!rect) { - var size = tex.getContentSize(); - rect = cc.rect(0, 0, size.width, size.height); - } - return this.initWithTexture(tex, rect); } + this._loader.clear(); + if (!tex.isLoaded()) { + this._loader.add(tex, function () { + this.initWithFile(filename, rect); + this.dispatchEvent("load"); + }, this); + return false; + } + + if (!rect) { + var size = tex.getContentSize(); + rect = cc.rect(0, 0, size.width, size.height); + } + return this.initWithTexture(tex, rect); }, /** @@ -672,6 +667,15 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ cc.assert(arguments.length !== 0, cc._LogInfos.CCSpriteBatchNode_initWithTexture); this._loader.clear(); + _t._textureLoaded = texture.isLoaded(); + if (!_t._textureLoaded) { + this._loader.add(texture, function () { + this.initWithTexture(texture, rect, rotated, counterclockwise); + this.dispatchEvent("load"); + }, this); + return false; + } + rotated = rotated || false; texture = this._renderCmd._handleTextureForRotatedTexture(texture, rect, rotated, counterclockwise); @@ -696,21 +700,12 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ _t._offsetPosition.y = 0; _t._hasChildren = false; - var locTextureLoaded = texture.isLoaded(); - _t._textureLoaded = locTextureLoaded; - - if (!locTextureLoaded) { - _t._rectRotated = rotated; - if (rect) { - _t._rect.x = rect.x; - _t._rect.y = rect.y; - _t._rect.width = rect.width; - _t._rect.height = rect.height; - } - - this._loader.add(texture, _t._renderCmd._textureLoadedCallback, _t); - _t.setTexture(texture); - return true; + _t._rectRotated = rotated; + if (rect) { + _t._rect.x = rect.x; + _t._rect.y = rect.y; + _t._rect.width = rect.width; + _t._rect.height = rect.height; } if (!rect) @@ -800,29 +795,20 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ // update rect var pNewTexture = newFrame.getTexture(); - var locTextureLoaded = newFrame.textureLoaded(); - if (!locTextureLoaded) { - _t._textureLoaded = false; - this._loader.add(newFrame, function (sender) { - _t.setNodeDirty(true); - _t._textureLoaded = true; - var locNewTexture = sender.getTexture(); - if (locNewTexture !== _t._texture) - _t._setTexture(locNewTexture); - _t.setTextureRect(sender.getRect(), sender.isRotated(), sender.getOriginalSize()); - _t.dispatchEvent("load"); - _t.setColor(_t._realColor); - }, _t); - } else { - _t._textureLoaded = true; - // update texture before updating texture rect - if (pNewTexture !== _t._texture) { - _t._setTexture(pNewTexture); - _t.setColor(_t._realColor); - } - _t.setTextureRect(newFrame.getRect(), newFrame.isRotated(), newFrame.getOriginalSize()); + _t._textureLoaded = newFrame.textureLoaded(); + this._loader.clear(); + if (!_t._textureLoaded) { + this._loader.add(pNewTexture, function () { + this.setSpriteFrame(newFrame); + this.dispatchEvent("load"); + }, this); + return false; + } + if (pNewTexture !== _t._texture) { + this._renderCmd._setTexture(pNewTexture); + _t.setColor(_t._realColor); } - this._renderCmd._updateForSetSpriteFrame(pNewTexture); + _t.setTextureRect(newFrame.getRect(), newFrame.isRotated(), newFrame.getOriginalSize()); }, /** @@ -900,7 +886,6 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ * @param {cc.Texture2D|String} texture */ setTexture: function (texture) { - this._loader.clear(); if(!texture) return this._renderCmd._setTexture(null); @@ -910,20 +895,20 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ if(isFileName) texture = cc.textureCache.addImage(texture); - if(texture._textureLoaded){ - this._setTexture(texture, isFileName); - this.setColor(this._realColor); - this._textureLoaded = true; - }else{ - this._renderCmd._setTexture(null); - this._loader.add(texture, this._renderCmd._textureLoadedCallback, this); + this._loader.clear(); + if (!texture._textureLoaded) { + // wait for the load to be set again + this._loader.add(texture, function () { + this.setTexture(texture); + this.dispatchEvent("load"); + }, this); + return false; } - }, - _setTexture: function(texture, change){ this._renderCmd._setTexture(texture); - if(change) - this._changeRectWithTexture(texture); + this._changeRectWithTexture(texture); + this.setColor(this._realColor); + this._textureLoaded = true; }, _changeRectWithTexture: function(texture){ diff --git a/cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js b/cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js index 45921a06b0..ba289bfcf1 100644 --- a/cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js +++ b/cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js @@ -185,26 +185,6 @@ } }; - proto._updateForSetSpriteFrame = function (pNewTexture, textureLoaded){ - this._colorized = false; - this._textureCoord.renderX = this._textureCoord.x; - this._textureCoord.renderY = this._textureCoord.y; - textureLoaded = textureLoaded || pNewTexture._textureLoaded; - if (textureLoaded) { - var curColor = this._node.getColor(); - if (curColor.r !== 255 || curColor.g !== 255 || curColor.b !== 255) - this._updateColor(); - } - }; - - proto._spriteFrameLoadedCallback = function (spriteFrame) { - var node = this; - node.setTextureRect(spriteFrame.getRect(), spriteFrame.isRotated(), spriteFrame.getOriginalSize()); - - node._renderCmd._updateColor(); - node.dispatchEvent("load"); - }; - proto._textureLoadedCallback = function (sender) { var node = this; if (node._textureLoaded) diff --git a/cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js b/cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js index 1ce724e9c1..3d02a422ce 100644 --- a/cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js +++ b/cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js @@ -88,14 +88,7 @@ proto.isFrameDisplayed = function (frame) { var node = this._node; return (cc.rectEqualToRect(frame.getRect(), node._rect) && frame.getTexture().getName() === node._texture.getName() - && cc.pointEqualToPoint(frame.getOffset(), node._unflippedOffsetPositionFromCenter)); - }; - - proto._updateForSetSpriteFrame = function () {}; - - proto._spriteFrameLoadedCallback = function (spriteFrame) { - this.setTextureRect(spriteFrame.getRect(), spriteFrame.isRotated(), spriteFrame.getOriginalSize()); - this.dispatchEvent("load"); + && cc.pointEqualToPoint(frame.getOffset(), node._unflippedOffsetPositionFromCenter)); }; proto._textureLoadedCallback = function (sender) { From 9ee41bd28e887974cd629988710e08a6e8410725 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Mon, 15 Aug 2016 17:11:57 +0800 Subject: [PATCH 08/16] Simplify scale9sprite asynchronous callback logic --- .../ccui/base-classes/UIScale9Sprite.js | 174 ++++++++---------- 1 file changed, 74 insertions(+), 100 deletions(-) diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index 0f2a8c98c6..a9a80c5bd0 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -81,7 +81,6 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit _insetRight: 0, _insetBottom: 0, - _spritesGenerated: false, _spriteFrameRotated: false, _textureLoaded:false, _className:"Scale9Sprite", @@ -258,7 +257,19 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit _getPreferredHeight: function () { return this._preferredSize.height; }, + + _asyncSetPreferredSize: function () { + this.removeEventListener('load', this._asyncSetPreferredSize, this); + this._cachePreferredSize = null; + this.setPreferredSize(this._cachePreferredSize); + }, setPreferredSize: function (preferredSize) { + if (!this._textureLoaded) { + this._cachePreferredSize = preferredSize; + this.removeEventListener('load', this._asyncSetPreferredSize, this); + this.addEventListener('load', this._asyncSetPreferredSize, this); + return false; + } this.setContentSize(preferredSize); this._preferredSize = preferredSize; @@ -310,15 +321,22 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit return cc.rect(this._capInsets); }, + asyncSetCapInsets: function () { + this.removeEventListener('load', this.asyncSetCapInsets, this); + this.setCapInsets(this._cacheCapInsets); + this._cacheCapInsets = null; + }, setCapInsets: function (capInsets) { var contentSize = this._contentSize; var tempWidth = contentSize.width, tempHeight = contentSize.height; // Asynchronous loading texture requires this data // This data does not take effect immediately, so it does not affect the existing texture. - this._capInsets.x = capInsets.x; - this._capInsets.y = capInsets.y; - this._capInsets.width = capInsets.width; - this._capInsets.height = capInsets.height; + if (!this._textureLoaded) { + this._cacheCapInsets = capInsets; + this.removeEventListener('load', this.asyncSetCapInsets, this); + this.addEventListener('load', this.asyncSetCapInsets, this); + return false; + } this.updateWithSprite( this._scale9Image, this._spriteRect, @@ -497,24 +515,13 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var locLoaded = texture.isLoaded(); this._textureLoaded = locLoaded; this._loader.clear(); - if(!locLoaded){ - this._loader.add(texture, function(sender){ - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } - var size = sender.getContentSize(); - this.updateWithBatchNode(this._scale9Image, cc.rect(0,0,size.width,size.height), false, this._capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; - this.setNodeDirty(); + if (!locLoaded) { + this._loader.add(texture, function () { + this.initWithFile(file, rect, capInsets); this.dispatchEvent("load"); }, this); + return false; } - return this.initWithBatchNode(new cc.SpriteBatchNode(file, 9), rect, false, capInsets); }, @@ -535,36 +542,18 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit capInsets = capInsets || cc.rect(0, 0, 0, 0); var texture = spriteFrame.getTexture(); - var loaded = texture.isLoaded(); - + var loaded = this._textureLoaded = texture.isLoaded(); this._loader.clear(); - if (loaded) { - var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); - // the texture is rotated on Canvas render mode, so isRotated always is false. - this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), capInsets); - } else { - this._capInsets.x = capInsets.x; - this._capInsets.y = capInsets.y; - this._capInsets.width = capInsets.width; - this._capInsets.height = capInsets.height; - var textureCallback = function () { - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } - var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); - // the texture is rotated on Canvas render mode, so isRotated always is false. - this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), this._capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; + if (!loaded) { + this._loader.add(texture, function () { + this.initWithSpriteFrame(spriteFrame, capInsets); this.dispatchEvent("load"); - }; - this._loader.add(texture, textureCallback, this); + }, this); + return false; } - + var batchNode = new cc.SpriteBatchNode(spriteFrame.getTexture(), 9); + // the texture is rotated on Canvas render mode, so isRotated always is false. + this.initWithBatchNode(batchNode, spriteFrame.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && spriteFrame.isRotated(), capInsets); return true; }, @@ -870,10 +859,24 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit * @return True if update success, false otherwise. */ updateWithSprite: function(sprite, spriteRect, spriteFrameRotated, offset, originalSize, capInsets) { - if (!sprite || !sprite.getSpriteFrame()) { + if (!sprite) return false; + + this._loader.clear(); + this._textureLoaded = sprite._textureLoaded; + if (!sprite._textureLoaded) { + this._loader.add(sprite, function () { + this.updateWithSprite(sprite, spriteRect, spriteFrameRotated, offset, originalSize, capInsets); + this.dispatchEvent("load"); + }, this); return false; } + var spriteFrame = sprite.getSpriteFrame(); + if (spriteFrame && cc._renderType === cc.game.RENDER_TYPE_CANVAS) { + spriteFrameRotated = false; + spriteRect = { x: 0, y: 0, height: spriteRect.height, width: spriteRect.width } + } + this._scale9Image = sprite; if(!this._scale9Image) return false; @@ -906,11 +909,8 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this.setState(this._brightState); this.setContentSize(size); - if(this._spritesGenerated === true) { - this.setOpacity(opacity); - this.setColor(color); - } - this._spritesGenerated = true; + this.setOpacity(opacity); + this.setColor(color); return true; }, /** @@ -926,38 +926,22 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit return false; } - this._capInsets.x = capInsets.x; - this._capInsets.y = capInsets.y; - this._capInsets.width = capInsets.width; - this._capInsets.height = capInsets.height; - - var sprite = new cc.Sprite(batchNode.getTexture()); - var pos = cc.p(0,0); - var originalSize = cc.size(originalRect.width,originalRect.height); - + var texture = batchNode.getTexture(); this._loader.clear(); - var tmpTexture = batchNode.getTexture(); - var loaded = this._textureLoaded = tmpTexture.isLoaded(); - if (loaded) { - return this.updateWithSprite(sprite, originalRect, rotated, pos, originalSize, capInsets); - } else { - this._loader.add(tmpTexture, function(sender){ - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } + var loaded = this._textureLoaded = texture.isLoaded(); + if (!loaded) { + this._loader.add(texture, function () { this.updateWithBatchNode(batchNode, originalRect, rotated, capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; - this.setVisible(true); - this.setNodeDirty(); this.dispatchEvent("load"); }, this); - this.setVisible(false); + return false; } + + var sprite = new cc.Sprite(texture); + var pos = cc.p(0,0); + var originalSize = cc.size(originalRect.width,originalRect.height); + + return this.updateWithSprite(sprite, originalRect, rotated, pos, originalSize, capInsets); }, /** @@ -967,30 +951,20 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit */ setSpriteFrame: function (spriteFrame, capInsets) { // Reset insets - if (!capInsets) - capInsets = cc.rect(); - var sprite = new cc.Sprite(spriteFrame.getTexture()); - var locLoaded = spriteFrame.textureLoaded(); - this._textureLoaded = locLoaded; + capInsets = capInsets || cc.rect(); + var texture = spriteFrame.getTexture(); + this._textureLoaded = texture._textureLoaded; this._loader.clear(); - if(!locLoaded){ - this._loader.add(spriteFrame, function(sender){ - var preferredSize = this._preferredSize, - restorePreferredSize = preferredSize.width !== 0 && preferredSize.height !== 0; - if (restorePreferredSize) { - preferredSize = cc.size(preferredSize.width, preferredSize.height); - } - this.updateWithBatchNode(this._scale9Image, sender.getRect(), cc._renderType === cc.game.RENDER_TYPE_WEBGL && sender.isRotated(), this._capInsets); - if (restorePreferredSize) { - this.setPreferredSize(preferredSize); - } - this._positionsAreDirty = true; - this.setNodeDirty(); + if (!texture._textureLoaded) { + this._loader.add(spriteFrame, function () { + this.setSpriteFrame(spriteFrame, capInsets); this.dispatchEvent("load"); - },this); + }, this); + return false; } - this.updateWithSprite(sprite, spriteFrame.getRect(),spriteFrame.isRotated(),spriteFrame.getOffset(),spriteFrame.getOriginalSize(),capInsets); + var sprite = new cc.Sprite(spriteFrame.getTexture()); + this.updateWithSprite(sprite, spriteFrame.getRect(),spriteFrame.isRotated(),spriteFrame.getOffset(),spriteFrame.getOriginalSize(),capInsets); this._insetLeft = capInsets.x; this._insetTop = capInsets.y; this._insetRight = this._originalSize.width - this._insetLeft - capInsets.width; From 58ac4623ca91402cbb2f8e1c6c454e1e8fd64f2c Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Wed, 17 Aug 2016 18:15:32 +0800 Subject: [PATCH 09/16] panda review code --- cocos2d/core/sprites/CCSprite.js | 35 +++++++++++++------ .../ccui/base-classes/UIScale9Sprite.js | 18 +++++----- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index e504c9f26e..31b9139495 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -635,9 +635,10 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ if (!tex) { tex = cc.textureCache.addImage(filename); } - this._loader.clear(); + if (!tex.isLoaded()) { - this._loader.add(tex, function () { + this._loader.clear(); + this._loader.once(tex, function () { this.initWithFile(filename, rect); this.dispatchEvent("load"); }, this); @@ -669,7 +670,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ _t._textureLoaded = texture.isLoaded(); if (!_t._textureLoaded) { - this._loader.add(texture, function () { + this._loader.once(texture, function () { this.initWithTexture(texture, rect, rotated, counterclockwise); this.dispatchEvent("load"); }, this); @@ -789,21 +790,22 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ this.setNodeDirty(true); - var frameOffset = newFrame.getOffset(); - _t._unflippedOffsetPositionFromCenter.x = frameOffset.x; - _t._unflippedOffsetPositionFromCenter.y = frameOffset.y; - // update rect var pNewTexture = newFrame.getTexture(); _t._textureLoaded = newFrame.textureLoaded(); this._loader.clear(); if (!_t._textureLoaded) { - this._loader.add(pNewTexture, function () { + this._loader.once(pNewTexture, function () { this.setSpriteFrame(newFrame); this.dispatchEvent("load"); }, this); return false; } + + var frameOffset = newFrame.getOffset(); + _t._unflippedOffsetPositionFromCenter.x = frameOffset.x; + _t._unflippedOffsetPositionFromCenter.y = frameOffset.y; + if (pNewTexture !== _t._texture) { this._renderCmd._setTexture(pNewTexture); _t.setColor(_t._realColor); @@ -898,7 +900,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ this._loader.clear(); if (!texture._textureLoaded) { // wait for the load to be set again - this._loader.add(texture, function () { + this._loader.once(texture, function () { this.setTexture(texture); this.dispatchEvent("load"); }, this); @@ -906,7 +908,8 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{ } this._renderCmd._setTexture(texture); - this._changeRectWithTexture(texture); + if (isFileName) + this._changeRectWithTexture(texture); this.setColor(this._realColor); this._textureLoaded = true; }, @@ -987,6 +990,18 @@ delete cc._tmp.PrototypeSprite; target: target }); }; + manager.prototype.once = function (source, callback, target) { + var tmpCallback = function (event) { + source.addEventListener('load', tmpCallback, target); + callback.call(target, event); + }; + source.addEventListener('load', tmpCallback, target); + this.list.push({ + source: source, + listener: tmpCallback, + target: target + }); + }; manager.prototype.clear = function () { while (this.list.length > 0) { var item = this.list.pop(); diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index a9a80c5bd0..8e8ea1e397 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -321,8 +321,8 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit return cc.rect(this._capInsets); }, - asyncSetCapInsets: function () { - this.removeEventListener('load', this.asyncSetCapInsets, this); + _asyncSetCapInsets: function () { + this.removeEventListener('load', this._asyncSetCapInsets, this); this.setCapInsets(this._cacheCapInsets); this._cacheCapInsets = null; }, @@ -333,8 +333,8 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit // This data does not take effect immediately, so it does not affect the existing texture. if (!this._textureLoaded) { this._cacheCapInsets = capInsets; - this.removeEventListener('load', this.asyncSetCapInsets, this); - this.addEventListener('load', this.asyncSetCapInsets, this); + this.removeEventListener('load', this._asyncSetCapInsets, this); + this.addEventListener('load', this._asyncSetCapInsets, this); return false; } @@ -516,7 +516,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._textureLoaded = locLoaded; this._loader.clear(); if (!locLoaded) { - this._loader.add(texture, function () { + this._loader.once(texture, function () { this.initWithFile(file, rect, capInsets); this.dispatchEvent("load"); }, this); @@ -545,7 +545,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit var loaded = this._textureLoaded = texture.isLoaded(); this._loader.clear(); if (!loaded) { - this._loader.add(texture, function () { + this._loader.once(texture, function () { this.initWithSpriteFrame(spriteFrame, capInsets); this.dispatchEvent("load"); }, this); @@ -864,7 +864,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._loader.clear(); this._textureLoaded = sprite._textureLoaded; if (!sprite._textureLoaded) { - this._loader.add(sprite, function () { + this._loader.once(sprite, function () { this.updateWithSprite(sprite, spriteRect, spriteFrameRotated, offset, originalSize, capInsets); this.dispatchEvent("load"); }, this); @@ -930,7 +930,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._loader.clear(); var loaded = this._textureLoaded = texture.isLoaded(); if (!loaded) { - this._loader.add(texture, function () { + this._loader.once(texture, function () { this.updateWithBatchNode(batchNode, originalRect, rotated, capInsets); this.dispatchEvent("load"); }, this); @@ -956,7 +956,7 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit this._textureLoaded = texture._textureLoaded; this._loader.clear(); if (!texture._textureLoaded) { - this._loader.add(spriteFrame, function () { + this._loader.once(spriteFrame, function () { this.setSpriteFrame(spriteFrame, capInsets); this.dispatchEvent("load"); }, this); From a52c830fd3a220de7a51dc99ada36fb87a47b1f1 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Wed, 17 Aug 2016 18:16:07 +0800 Subject: [PATCH 10/16] Fixed a bug about s9sprite update texture --- extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js b/extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js index 35f940b784..57a27ed3c3 100644 --- a/extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js +++ b/extensions/ccui/base-classes/UIScale9SpriteCanvasRenderCmd.js @@ -181,6 +181,7 @@ if(!this._cacheSprite.getParent()) node.addChild(this._cacheSprite, -1); + this._cacheSprite._renderCmd._updateColor(); }; proto.setState = function(state){ From 7a84cdc462007b73bd4603aa15fe4e2a604d6065 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 10:40:07 +0800 Subject: [PATCH 11/16] =?UTF-8?q?Asynchronous=20loading=20texture=EF=BC=88?= =?UTF-8?q?CCMenuItem=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cocos2d/core/sprites/CCSprite.js | 2 +- cocos2d/menus/CCMenuItem.js | 41 ++++++++++---------------------- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index 31b9139495..215401dac6 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -992,7 +992,7 @@ delete cc._tmp.PrototypeSprite; }; manager.prototype.once = function (source, callback, target) { var tmpCallback = function (event) { - source.addEventListener('load', tmpCallback, target); + source.removeEventListener('load', tmpCallback, target); callback.call(target, event); }; source.addEventListener('load', tmpCallback, target); diff --git a/cocos2d/menus/CCMenuItem.js b/cocos2d/menus/CCMenuItem.js index 377fd70a3c..de25beecd9 100644 --- a/cocos2d/menus/CCMenuItem.js +++ b/cocos2d/menus/CCMenuItem.js @@ -701,6 +701,7 @@ cc.MenuItemSprite = cc.MenuItem.extend(/** @lends cc.MenuItemSprite# */{ this._normalImage = null; this._selectedImage = null; this._disabledImage = null; + this._loader = new cc.Sprite.LoadManager(); if (normalSprite !== undefined) { //normalSprite = normalSprite; @@ -722,17 +723,16 @@ cc.MenuItemSprite = cc.MenuItem.extend(/** @lends cc.MenuItemSprite# */{ disabledImage = null; } + this._loader.clear(); if (normalSprite.textureLoaded && !normalSprite.textureLoaded()) { - normalSprite.addEventListener("load", function (sender) { - this.width = sender.width; - this.height = sender.height; - if (this.parent instanceof cc.Menu) { - this.parent.updateAlign(); - } + this._loader.once(normalSprite, function () { + this.initWithNormalSprite(normalSprite, selectedSprite, disabledImage, callback, target); }, this); + return false; } this.initWithNormalSprite(normalSprite, selectedSprite, disabledImage, callback, target); + return true; } }, @@ -849,6 +849,13 @@ cc.MenuItemSprite = cc.MenuItem.extend(/** @lends cc.MenuItemSprite# */{ * @return {Boolean} */ initWithNormalSprite: function (normalSprite, selectedSprite, disabledSprite, callback, target) { + this._loader.clear(); + if (normalSprite.textureLoaded && !normalSprite.textureLoaded()) { + this._loader.once(normalSprite, function () { + this.initWithNormalSprite(normalSprite, selectedSprite, disabledSprite, callback, target); + }, this); + return false; + } this.initWithCallback(callback, target); this.setNormalImage(normalSprite); this.setSelectedImage(selectedSprite); @@ -857,18 +864,6 @@ cc.MenuItemSprite = cc.MenuItem.extend(/** @lends cc.MenuItemSprite# */{ if (locNormalImage) { this.width = locNormalImage.width; this.height = locNormalImage.height; - - if (locNormalImage.textureLoaded && !locNormalImage.textureLoaded()) { - locNormalImage.addEventListener("load", function (sender) { - this.width = sender.width; - this.height = sender.height; - this.setCascadeColorEnabled(true); - this.setCascadeOpacityEnabled(true); - if (this.parent instanceof cc.Menu) { - this.parent.updateAlign(); - } - }, this); - } } this.setCascadeColorEnabled(true); this.setCascadeOpacityEnabled(true); @@ -1016,16 +1011,6 @@ cc.MenuItemImage = cc.MenuItemSprite.extend(/** @lends cc.MenuItemImage# */{ selectedImage && (selectedSprite = new cc.Sprite(selectedImage)); - if (normalSprite.textureLoaded && !normalSprite.textureLoaded()) { - normalSprite.addEventListener("load", function (sender) { - this.width = sender.width; - this.height = sender.height; - if (this.parent instanceof cc.Menu) { - this.parent.updateAlign(); - } - }, this); - } - if (four === undefined) { callback = three; } From 06dcfeb4da749c5bc3df92f91499df02303fc204 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 11:31:58 +0800 Subject: [PATCH 12/16] Fixed a bug about scale9sprite anchorpoint --- extensions/ccui/base-classes/UIScale9Sprite.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index 8e8ea1e397..b37cbafc00 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -235,6 +235,10 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit } else { this.init(); + this.setCascadeColorEnabled(true); + this.setCascadeOpacityEnabled(true); + this.setAnchorPoint(0.5, 0.5); + this._positionsAreDirty = true; } }, From 3c9515f07cfe5f5a3105a7592e01a63c986d5ba2 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 11:54:46 +0800 Subject: [PATCH 13/16] Fixed a bug about throw error --- cocos2d/core/sprites/CCSprite.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cocos2d/core/sprites/CCSprite.js b/cocos2d/core/sprites/CCSprite.js index 215401dac6..de6d763c5c 100644 --- a/cocos2d/core/sprites/CCSprite.js +++ b/cocos2d/core/sprites/CCSprite.js @@ -983,6 +983,7 @@ delete cc._tmp.PrototypeSprite; }; manager.prototype.add = function (source, callback, target) { + if (!source || !source.addEventListener) return; source.addEventListener('load', callback, target); this.list.push({ source: source, @@ -991,6 +992,7 @@ delete cc._tmp.PrototypeSprite; }); }; manager.prototype.once = function (source, callback, target) { + if (!source || !source.addEventListener) return; var tmpCallback = function (event) { source.removeEventListener('load', tmpCallback, target); callback.call(target, event); From 4dcd488f891a036bfd4d68f2ba8b150abddb6e64 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 13:40:56 +0800 Subject: [PATCH 14/16] Fixed a bug about throw error --- extensions/ccui/base-classes/UIScale9Sprite.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/ccui/base-classes/UIScale9Sprite.js b/extensions/ccui/base-classes/UIScale9Sprite.js index b37cbafc00..eea66f9935 100644 --- a/extensions/ccui/base-classes/UIScale9Sprite.js +++ b/extensions/ccui/base-classes/UIScale9Sprite.js @@ -264,10 +264,11 @@ ccui.Scale9Sprite = cc.Scale9Sprite = cc.Node.extend(/** @lends ccui.Scale9Sprit _asyncSetPreferredSize: function () { this.removeEventListener('load', this._asyncSetPreferredSize, this); - this._cachePreferredSize = null; this.setPreferredSize(this._cachePreferredSize); + this._cachePreferredSize = null; }, setPreferredSize: function (preferredSize) { + if (!preferredSize) return; if (!this._textureLoaded) { this._cachePreferredSize = preferredSize; this.removeEventListener('load', this._asyncSetPreferredSize, this); From ef34d55531aeb0e46bdba320c0253a598b354427 Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 14:12:55 +0800 Subject: [PATCH 15/16] update _normalTextureLoaded (UIButton) --- extensions/ccui/uiwidgets/UIButton.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/extensions/ccui/uiwidgets/UIButton.js b/extensions/ccui/uiwidgets/UIButton.js index 81f6a2b5f1..6bb7582e2e 100644 --- a/extensions/ccui/uiwidgets/UIButton.js +++ b/extensions/ccui/uiwidgets/UIButton.js @@ -233,13 +233,19 @@ ccui.Button = ccui.Widget.extend(/** @lends ccui.Button# */{ * @param {ccui.Widget.LOCAL_TEXTURE|ccui.Widget.PLIST_TEXTURE} texType */ loadTextureNormal: function (normal, texType) { - if (!normal) return; - + if (!normal) + return; texType = texType || ccui.Widget.LOCAL_TEXTURE; this._normalFileName = normal; this._normalTexType = texType; + var self = this; var normalRenderer = this._buttonNormalRenderer; + if(!normalRenderer._textureLoaded){ + normalRenderer.addEventListener("load", function(){ + self.loadTextureNormal(self._normalFileName, self._normalTexType); + }); + } switch (this._normalTexType){ case ccui.Widget.LOCAL_TEXTURE: //SetTexture cannot load resource @@ -252,19 +258,14 @@ ccui.Button = ccui.Widget.extend(/** @lends ccui.Button# */{ default: break; } - var loaded = normalRenderer._textureLoaded; - normalRenderer.removeEventListener('load', this._loadNormalTextureCallback); - normalRenderer.addEventListener('load', this._loadNormalTextureCallback, this); - if (loaded) { - this._loadNormalTextureCallback(); - } - }, - _loadNormalTextureCallback: function () { + + this._normalTextureLoaded = normalRenderer._textureLoaded; + this._normalTextureSize = this._buttonNormalRenderer.getContentSize(); this._updateChildrenDisplayedRGBA(); if (this._unifySize){ if (this._scale9Enabled){ - this._buttonNormalRenderer.setCapInsets(this._capInsetsNormal); + normalRenderer.setCapInsets(this._capInsetsNormal); this._updateContentSizeWithTextureSize(this._getNormalSize()); } }else From 7f9f4719de5270166f71697f0d654d49f7e5a94f Mon Sep 17 00:00:00 2001 From: VisualSJ Date: Thu, 18 Aug 2016 14:32:58 +0800 Subject: [PATCH 16/16] change load audio event (ios) --- cocos2d/audio/CCAudio.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cocos2d/audio/CCAudio.js b/cocos2d/audio/CCAudio.js index 50419a3083..4561f09ddc 100644 --- a/cocos2d/audio/CCAudio.js +++ b/cocos2d/audio/CCAudio.js @@ -55,6 +55,10 @@ support.USE_LOADER_EVENT = 'canplay'; } + if (sys.os === sys.OS_IOS) { + support.USE_LOADER_EVENT = 'loadedmetadata'; + } + if (sys.os === sys.OS_ANDROID) { if (sys.browserType === sys.BROWSER_TYPE_UC) { support.ONE_SOURCE = true;