@@ -224,8 +224,11 @@ cc.LabelBMFont = cc.SpriteBatchNode.extend(/** @lends cc.LabelBMFont# */{
224224 if ( fntFile ) {
225225 var newConf = cc . loader . getRes ( fntFile ) ;
226226 if ( ! newConf ) {
227- cc . log ( "cc.LabelBMFont.initWithString(): Impossible to create font. Please check file" ) ;
228- return false ;
227+ newConf = cc . FntFrameCache [ cc . path . basename ( fntFile ) ] ;
228+ if ( ! newConf ) {
229+ cc . log ( "cc.LabelBMFont.initWithString(): Impossible to create font. Please check file" ) ;
230+ return false ;
231+ }
229232 }
230233
231234 self . _config = newConf ;
@@ -881,7 +884,11 @@ cc.LabelBMFont.create = function (str, fntFile, width, alignment, imageOffset) {
881884 return new cc . LabelBMFont ( str , fntFile , width , alignment , imageOffset ) ;
882885} ;
883886
887+ cc . FntFrameCache = { } ;
888+
884889var _fntLoader = {
890+ FNT_HEAD : / f n t f r a m e s [ ^ \n ] * ( \n | $ ) / gi,
891+ FNT_FRAME_NAME : / f n t f r a m e [ ^ \n ] * ( \n | $ ) / gi,
885892 INFO_EXP : / i n f o [ ^ \n ] * ( \n | $ ) / gi,
886893 COMMON_EXP : / c o m m o n [ ^ \n ] * ( \n | $ ) / gi,
887894 PAGE_EXP : / p a g e [ ^ \n ] * ( \n | $ ) / gi,
@@ -907,24 +914,8 @@ var _fntLoader = {
907914 return obj ;
908915 } ,
909916
910- /**
911- * Parse Fnt string.
912- * @param fntStr
913- * @param url
914- * @returns {{} }
915- */
916- parseFnt : function ( fntStr , url ) {
917- var self = this , fnt = { } ;
918- //padding
919- var infoObj = self . _parseStrToObj ( fntStr . match ( self . INFO_EXP ) [ 0 ] ) ;
920- var paddingArr = infoObj [ "padding" ] . split ( "," ) ;
921- var padding = {
922- left : parseInt ( paddingArr [ 0 ] ) ,
923- top : parseInt ( paddingArr [ 1 ] ) ,
924- right : parseInt ( paddingArr [ 2 ] ) ,
925- bottom : parseInt ( paddingArr [ 3 ] )
926- } ;
927-
917+ _parseFntContent : function ( fnt , fntStr , url ) {
918+ var self = this ;
928919 //common
929920 var commonObj = self . _parseStrToObj ( fntStr . match ( self . COMMON_EXP ) [ 0 ] ) ;
930921 fnt . commonHeight = commonObj [ "lineHeight" ] ;
@@ -963,6 +954,39 @@ var _fntLoader = {
963954 kerningDict [ ( kerningObj [ "first" ] << 16 ) | ( kerningObj [ "second" ] & 0xffff ) ] = kerningObj [ "amount" ] ;
964955 }
965956 }
957+
958+ return fnt ;
959+ } ,
960+
961+ /**
962+ * Parse Fnt string.
963+ * @param fntStr
964+ * @param url
965+ * @returns {{} }
966+ */
967+ parseFnt : function ( fntStr , url ) {
968+ var self = this , fnt = { } ;
969+ var headString = fntStr . match ( self . FNT_HEAD ) ;
970+ if ( headString ) {
971+ var headObj = self . _parseStrToObj ( headString [ 0 ] ) ;
972+ if ( headObj && headObj . count ) {
973+ fntStr = fntStr . substr ( headString [ 0 ] . length ) ;
974+ var fntFrames = fntStr . split ( "----" ) ;
975+ for ( var i = 0 ; i < headObj . count ; ++ i ) {
976+ var contentString = fntFrames [ i ] ;
977+ var frameNameStr = contentString . match ( self . FNT_FRAME_NAME ) ;
978+ if ( frameNameStr ) {
979+ var frameName = self . _parseStrToObj ( frameNameStr [ 0 ] ) ;
980+ if ( frameName && frameName . name ) {
981+ fnt = { } ;
982+ cc . FntFrameCache [ frameName . name ] = this . _parseFntContent ( fnt , contentString . substr ( frameNameStr [ 0 ] . length ) , url ) ;
983+ }
984+ }
985+ }
986+ }
987+ } else {
988+ fnt = this . _parseFntContent ( fnt , fntStr , url ) ;
989+ }
966990 return fnt ;
967991 } ,
968992
@@ -982,3 +1006,4 @@ var _fntLoader = {
9821006 }
9831007} ;
9841008cc . loader . register ( [ "fnt" ] , _fntLoader ) ;
1009+
0 commit comments