Skip to content

Commit c55c739

Browse files
authored
Merge pull request #3350 from VisualSJ/war2
Asynchronous loading texture
2 parents 48f6318 + 7f9f471 commit c55c739

File tree

10 files changed

+247
-256
lines changed

10 files changed

+247
-256
lines changed

cocos2d/audio/CCAudio.js

+4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
support.USE_LOADER_EVENT = 'canplay';
5656
}
5757

58+
if (sys.os === sys.OS_IOS) {
59+
support.USE_LOADER_EVENT = 'loadedmetadata';
60+
}
61+
5862
if (sys.os === sys.OS_ANDROID) {
5963
if (sys.browserType === sys.BROWSER_TYPE_UC) {
6064
support.ONE_SOURCE = true;

cocos2d/core/event-manager/CCEventHelper.js

+19-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,25 @@ cc.EventHelper.prototype = {
7171
return false;
7272
},
7373

74-
removeEventListener: function( type, target){
74+
removeEventListener: function( type, listener, target){
75+
if ( this._listeners === undefined )
76+
return;
77+
78+
var listeners = this._listeners;
79+
var listenerArray = listeners[ type ];
80+
81+
if ( listenerArray !== undefined ) {
82+
for(var i = 0; i < listenerArray.length ; ){
83+
var selListener = listenerArray[i];
84+
if(selListener.eventTarget === target && selListener.callback === listener)
85+
listenerArray.splice( i, 1 );
86+
else
87+
i++
88+
}
89+
}
90+
},
91+
92+
removeEventTarget: function( type, listener, target){
7593
if ( this._listeners === undefined )
7694
return;
7795

cocos2d/core/sprites/CCSprite.js

+98-77
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
123123
ctor: function (fileName, rect, rotated) {
124124
var self = this;
125125
cc.Node.prototype.ctor.call(self);
126+
self._loader = new cc.Sprite.LoadManager();
126127
self._shouldBeHidden = false;
127128
self._offsetPosition = cc.p(0, 0);
128129
self._unflippedOffsetPositionFromCenter = cc.p(0, 0);
@@ -246,19 +247,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
246247
*/
247248
initWithSpriteFrame:function (spriteFrame) {
248249
cc.assert(spriteFrame, cc._LogInfos.Sprite_initWithSpriteFrame);
249-
250-
if(!spriteFrame.textureLoaded()){
251-
//add event listener
252-
this._textureLoaded = false;
253-
spriteFrame.addEventListener("load", this._renderCmd._spriteFrameLoadedCallback, this);
254-
}
255-
256-
//TODO
257-
var rotated = cc._renderType === cc.game.RENDER_TYPE_CANVAS ? false : spriteFrame._rotated;
258-
var ret = this.initWithTexture(spriteFrame.getTexture(), spriteFrame.getRect(), rotated);
259-
this.setSpriteFrame(spriteFrame);
260-
261-
return ret;
250+
return this.setSpriteFrame(spriteFrame);
262251
},
263252

264253
/**
@@ -645,14 +634,22 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
645634
var tex = cc.textureCache.getTextureForKey(filename);
646635
if (!tex) {
647636
tex = cc.textureCache.addImage(filename);
648-
return this.initWithTexture(tex, rect || cc.rect(0, 0, tex._contentSize.width, tex._contentSize.height));
649-
} else {
650-
if (!rect) {
651-
var size = tex.getContentSize();
652-
rect = cc.rect(0, 0, size.width, size.height);
653-
}
654-
return this.initWithTexture(tex, rect);
655637
}
638+
639+
if (!tex.isLoaded()) {
640+
this._loader.clear();
641+
this._loader.once(tex, function () {
642+
this.initWithFile(filename, rect);
643+
this.dispatchEvent("load");
644+
}, this);
645+
return false;
646+
}
647+
648+
if (!rect) {
649+
var size = tex.getContentSize();
650+
rect = cc.rect(0, 0, size.width, size.height);
651+
}
652+
return this.initWithTexture(tex, rect);
656653
},
657654

658655
/**
@@ -669,6 +666,16 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
669666
initWithTexture: function (texture, rect, rotated, counterclockwise) {
670667
var _t = this;
671668
cc.assert(arguments.length !== 0, cc._LogInfos.CCSpriteBatchNode_initWithTexture);
669+
this._loader.clear();
670+
671+
_t._textureLoaded = texture.isLoaded();
672+
if (!_t._textureLoaded) {
673+
this._loader.once(texture, function () {
674+
this.initWithTexture(texture, rect, rotated, counterclockwise);
675+
this.dispatchEvent("load");
676+
}, this);
677+
return false;
678+
}
672679

673680
rotated = rotated || false;
674681
texture = this._renderCmd._handleTextureForRotatedTexture(texture, rect, rotated, counterclockwise);
@@ -694,22 +701,12 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
694701
_t._offsetPosition.y = 0;
695702
_t._hasChildren = false;
696703

697-
var locTextureLoaded = texture.isLoaded();
698-
_t._textureLoaded = locTextureLoaded;
699-
700-
if (!locTextureLoaded) {
701-
_t._rectRotated = rotated;
702-
if (rect) {
703-
_t._rect.x = rect.x;
704-
_t._rect.y = rect.y;
705-
_t._rect.width = rect.width;
706-
_t._rect.height = rect.height;
707-
}
708-
if(_t.texture)
709-
_t.texture.removeEventListener("load", _t);
710-
texture.addEventListener("load", _t._renderCmd._textureLoadedCallback, _t);
711-
_t.setTexture(texture);
712-
return true;
704+
_t._rectRotated = rotated;
705+
if (rect) {
706+
_t._rect.x = rect.x;
707+
_t._rect.y = rect.y;
708+
_t._rect.width = rect.width;
709+
_t._rect.height = rect.height;
713710
}
714711

715712
if (!rect)
@@ -789,38 +786,31 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
789786
newFrame = cc.spriteFrameCache.getSpriteFrame(newFrame);
790787
cc.assert(newFrame, cc._LogInfos.Sprite_setSpriteFrame)
791788
}
789+
this._loader.clear();
792790

793791
this.setNodeDirty(true);
794792

793+
// update rect
794+
var pNewTexture = newFrame.getTexture();
795+
_t._textureLoaded = newFrame.textureLoaded();
796+
this._loader.clear();
797+
if (!_t._textureLoaded) {
798+
this._loader.once(pNewTexture, function () {
799+
this.setSpriteFrame(newFrame);
800+
this.dispatchEvent("load");
801+
}, this);
802+
return false;
803+
}
804+
795805
var frameOffset = newFrame.getOffset();
796806
_t._unflippedOffsetPositionFromCenter.x = frameOffset.x;
797807
_t._unflippedOffsetPositionFromCenter.y = frameOffset.y;
798808

799-
// update rect
800-
var pNewTexture = newFrame.getTexture();
801-
var locTextureLoaded = newFrame.textureLoaded();
802-
if (!locTextureLoaded) {
803-
_t._textureLoaded = false;
804-
newFrame.addEventListener("load", function (sender) {
805-
_t.setNodeDirty(true);
806-
_t._textureLoaded = true;
807-
var locNewTexture = sender.getTexture();
808-
if (locNewTexture !== _t._texture)
809-
_t._setTexture(locNewTexture);
810-
_t.setTextureRect(sender.getRect(), sender.isRotated(), sender.getOriginalSize());
811-
_t.dispatchEvent("load");
812-
_t.setColor(_t._realColor);
813-
}, _t);
814-
} else {
815-
_t._textureLoaded = true;
816-
// update texture before updating texture rect
817-
if (pNewTexture !== _t._texture) {
818-
_t._setTexture(pNewTexture);
819-
_t.setColor(_t._realColor);
820-
}
821-
_t.setTextureRect(newFrame.getRect(), newFrame.isRotated(), newFrame.getOriginalSize());
809+
if (pNewTexture !== _t._texture) {
810+
this._renderCmd._setTexture(pNewTexture);
811+
_t.setColor(_t._realColor);
822812
}
823-
this._renderCmd._updateForSetSpriteFrame(pNewTexture);
813+
_t.setTextureRect(newFrame.getRect(), newFrame.isRotated(), newFrame.getOriginalSize());
824814
},
825815

826816
/**
@@ -907,33 +897,29 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
907897
if(isFileName)
908898
texture = cc.textureCache.addImage(texture);
909899

910-
if(texture._textureLoaded){
911-
this._setTexture(texture, isFileName);
912-
this.setColor(this._realColor);
913-
this._textureLoaded = true;
914-
}else{
915-
this._renderCmd._setTexture(null);
916-
texture.addEventListener("load", function(){
917-
this.setNodeDirty(true);
918-
this._setTexture(texture, isFileName);
919-
this.setColor(this._realColor);
920-
this._textureLoaded = true;
900+
this._loader.clear();
901+
if (!texture._textureLoaded) {
902+
// wait for the load to be set again
903+
this._loader.once(texture, function () {
904+
this.setTexture(texture);
905+
this.dispatchEvent("load");
921906
}, this);
907+
return false;
922908
}
923-
},
924909

925-
_setTexture: function(texture, change){
926910
this._renderCmd._setTexture(texture);
927-
if(change)
911+
if (isFileName)
928912
this._changeRectWithTexture(texture);
913+
this.setColor(this._realColor);
914+
this._textureLoaded = true;
929915
},
930916

931917
_changeRectWithTexture: function(texture){
932918
var contentSize = texture._contentSize;
933919
var rect = cc.rect(
934-
0, 0,
935-
contentSize.width, contentSize.height
936-
);
920+
0, 0,
921+
contentSize.width, contentSize.height
922+
);
937923
this.setTextureRect(rect);
938924
},
939925

@@ -990,3 +976,38 @@ cc.EventHelper.prototype.apply(cc.Sprite.prototype);
990976
cc.assert(cc.isFunction(cc._tmp.PrototypeSprite), cc._LogInfos.MissingFile, "SpritesPropertyDefine.js");
991977
cc._tmp.PrototypeSprite();
992978
delete cc._tmp.PrototypeSprite;
979+
980+
(function () {
981+
var manager = cc.Sprite.LoadManager = function () {
982+
this.list = [];
983+
};
984+
985+
manager.prototype.add = function (source, callback, target) {
986+
if (!source || !source.addEventListener) return;
987+
source.addEventListener('load', callback, target);
988+
this.list.push({
989+
source: source,
990+
listener: callback,
991+
target: target
992+
});
993+
};
994+
manager.prototype.once = function (source, callback, target) {
995+
if (!source || !source.addEventListener) return;
996+
var tmpCallback = function (event) {
997+
source.removeEventListener('load', tmpCallback, target);
998+
callback.call(target, event);
999+
};
1000+
source.addEventListener('load', tmpCallback, target);
1001+
this.list.push({
1002+
source: source,
1003+
listener: tmpCallback,
1004+
target: target
1005+
});
1006+
};
1007+
manager.prototype.clear = function () {
1008+
while (this.list.length > 0) {
1009+
var item = this.list.pop();
1010+
item.source.removeEventListener('load', item.listener, item.target);
1011+
}
1012+
};
1013+
})();

cocos2d/core/sprites/CCSpriteCanvasRenderCmd.js

-20
Original file line numberDiff line numberDiff line change
@@ -185,26 +185,6 @@
185185
}
186186
};
187187

188-
proto._updateForSetSpriteFrame = function (pNewTexture, textureLoaded){
189-
this._colorized = false;
190-
this._textureCoord.renderX = this._textureCoord.x;
191-
this._textureCoord.renderY = this._textureCoord.y;
192-
textureLoaded = textureLoaded || pNewTexture._textureLoaded;
193-
if (textureLoaded) {
194-
var curColor = this._node.getColor();
195-
if (curColor.r !== 255 || curColor.g !== 255 || curColor.b !== 255)
196-
this._updateColor();
197-
}
198-
};
199-
200-
proto._spriteFrameLoadedCallback = function (spriteFrame) {
201-
var node = this;
202-
node.setTextureRect(spriteFrame.getRect(), spriteFrame.isRotated(), spriteFrame.getOriginalSize());
203-
204-
node._renderCmd._updateColor();
205-
node.dispatchEvent("load");
206-
};
207-
208188
proto._textureLoadedCallback = function (sender) {
209189
var node = this;
210190
if (node._textureLoaded)

cocos2d/core/sprites/CCSpriteWebGLRenderCmd.js

+1-8
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,7 @@
8888
proto.isFrameDisplayed = function (frame) {
8989
var node = this._node;
9090
return (cc.rectEqualToRect(frame.getRect(), node._rect) && frame.getTexture().getName() === node._texture.getName()
91-
&& cc.pointEqualToPoint(frame.getOffset(), node._unflippedOffsetPositionFromCenter));
92-
};
93-
94-
proto._updateForSetSpriteFrame = function () {};
95-
96-
proto._spriteFrameLoadedCallback = function (spriteFrame) {
97-
this.setTextureRect(spriteFrame.getRect(), spriteFrame.isRotated(), spriteFrame.getOriginalSize());
98-
this.dispatchEvent("load");
91+
&& cc.pointEqualToPoint(frame.getOffset(), node._unflippedOffsetPositionFromCenter));
9992
};
10093

10194
proto._textureLoadedCallback = function (sender) {

cocos2d/core/textures/CCTexture2D.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () {
380380
* @param {cc.Node} target
381381
*/
382382
removeLoadedEventListener: function (target) {
383-
this.removeEventListener("load", target);
383+
this.removeEventTarget("load", target);
384384
},
385385

386386
_generateColorTexture: function(){/*overide*/},

cocos2d/core/textures/TexturesWebGL.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ cc._tmp.WebGLTexture2D = function () {
773773
* @param {cc.Node} target
774774
*/
775775
removeLoadedEventListener: function (target) {
776-
this.removeEventListener("load", target);
776+
this.removeEventTarget("load", target);
777777
}
778778
});
779779
};

0 commit comments

Comments
 (0)