@@ -123,6 +123,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
123
123
ctor : function ( fileName , rect , rotated ) {
124
124
var self = this ;
125
125
cc . Node . prototype . ctor . call ( self ) ;
126
+ self . _loader = new cc . Sprite . LoadManager ( ) ;
126
127
self . _shouldBeHidden = false ;
127
128
self . _offsetPosition = cc . p ( 0 , 0 ) ;
128
129
self . _unflippedOffsetPositionFromCenter = cc . p ( 0 , 0 ) ;
@@ -246,19 +247,7 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
246
247
*/
247
248
initWithSpriteFrame :function ( spriteFrame ) {
248
249
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 ) ;
262
251
} ,
263
252
264
253
/**
@@ -645,14 +634,22 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
645
634
var tex = cc . textureCache . getTextureForKey ( filename ) ;
646
635
if ( ! tex ) {
647
636
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 ) ;
655
637
}
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 ) ;
656
653
} ,
657
654
658
655
/**
@@ -669,6 +666,16 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
669
666
initWithTexture : function ( texture , rect , rotated , counterclockwise ) {
670
667
var _t = this ;
671
668
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
+ }
672
679
673
680
rotated = rotated || false ;
674
681
texture = this . _renderCmd . _handleTextureForRotatedTexture ( texture , rect , rotated , counterclockwise ) ;
@@ -694,22 +701,12 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
694
701
_t . _offsetPosition . y = 0 ;
695
702
_t . _hasChildren = false ;
696
703
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 ;
713
710
}
714
711
715
712
if ( ! rect )
@@ -789,38 +786,31 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
789
786
newFrame = cc . spriteFrameCache . getSpriteFrame ( newFrame ) ;
790
787
cc . assert ( newFrame , cc . _LogInfos . Sprite_setSpriteFrame )
791
788
}
789
+ this . _loader . clear ( ) ;
792
790
793
791
this . setNodeDirty ( true ) ;
794
792
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
+
795
805
var frameOffset = newFrame . getOffset ( ) ;
796
806
_t . _unflippedOffsetPositionFromCenter . x = frameOffset . x ;
797
807
_t . _unflippedOffsetPositionFromCenter . y = frameOffset . y ;
798
808
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 ) ;
822
812
}
823
- this . _renderCmd . _updateForSetSpriteFrame ( pNewTexture ) ;
813
+ _t . setTextureRect ( newFrame . getRect ( ) , newFrame . isRotated ( ) , newFrame . getOriginalSize ( ) ) ;
824
814
} ,
825
815
826
816
/**
@@ -907,33 +897,29 @@ cc.Sprite = cc.Node.extend(/** @lends cc.Sprite# */{
907
897
if ( isFileName )
908
898
texture = cc . textureCache . addImage ( texture ) ;
909
899
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" ) ;
921
906
} , this ) ;
907
+ return false ;
922
908
}
923
- } ,
924
909
925
- _setTexture : function ( texture , change ) {
926
910
this . _renderCmd . _setTexture ( texture ) ;
927
- if ( change )
911
+ if ( isFileName )
928
912
this . _changeRectWithTexture ( texture ) ;
913
+ this . setColor ( this . _realColor ) ;
914
+ this . _textureLoaded = true ;
929
915
} ,
930
916
931
917
_changeRectWithTexture : function ( texture ) {
932
918
var contentSize = texture . _contentSize ;
933
919
var rect = cc . rect (
934
- 0 , 0 ,
935
- contentSize . width , contentSize . height
936
- ) ;
920
+ 0 , 0 ,
921
+ contentSize . width , contentSize . height
922
+ ) ;
937
923
this . setTextureRect ( rect ) ;
938
924
} ,
939
925
@@ -990,3 +976,38 @@ cc.EventHelper.prototype.apply(cc.Sprite.prototype);
990
976
cc . assert ( cc . isFunction ( cc . _tmp . PrototypeSprite ) , cc . _LogInfos . MissingFile , "SpritesPropertyDefine.js" ) ;
991
977
cc . _tmp . PrototypeSprite ( ) ;
992
978
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
+ } ) ( ) ;
0 commit comments