Skip to content

Commit 184a56d

Browse files
committed
Merge pull request cocos2d#1260 from ShengxiangChen/issue_addSpriteFramesWithJson
add json support to SpriteFrameCache
2 parents 283ee34 + 76b4e5f commit 184a56d

File tree

3 files changed

+93
-93
lines changed

3 files changed

+93
-93
lines changed

cocos2d/sprite_nodes/CCSprite.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,9 @@ cc.Sprite = cc.NodeRGBA.extend(/** @lends cc.Sprite# */{
12711271
_textureLoadedCallback: null,
12721272

12731273
_textureLoadedCallbackForWebGL: function (sender) {
1274+
if(this._textureLoaded)
1275+
return;
1276+
12741277
this._textureLoaded = true;
12751278
var locRect = this._rect;
12761279
if (!locRect) {
@@ -1291,6 +1294,9 @@ cc.Sprite = cc.NodeRGBA.extend(/** @lends cc.Sprite# */{
12911294
},
12921295

12931296
_textureLoadedCallbackForCanvas: function (sender) {
1297+
if(this._textureLoaded)
1298+
return;
1299+
12941300
this._textureLoaded = true;
12951301
var locRect = this._rect;
12961302
if (!locRect) {
@@ -1662,7 +1668,8 @@ cc.Sprite = cc.NodeRGBA.extend(/** @lends cc.Sprite# */{
16621668
var locNewTexture = sender.getTexture();
16631669
if (locNewTexture != this._texture)
16641670
this.setTexture(locNewTexture);
1665-
this.setTextureRect(sender.getRect(), sender._rectRotated, sender.getOriginalSize());
1671+
this.setTextureRect(sender.getRect(), sender.isRotated(), sender.getOriginalSize());
1672+
16661673
this._callLoadedEventCallbacks();
16671674
}, this);
16681675
}

cocos2d/sprite_nodes/CCSpriteFrame.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ cc.SpriteFrame = cc.Class.extend(/** @lends cc.SpriteFrame# */{
224224
if(!locLoaded){
225225
texture.addLoadedEventListener(function(sender){
226226
this._textureLoaded = true;
227-
if(this._rotated){
227+
if(this._rotated && cc.renderContextType === cc.CANVAS){
228228
var tempElement = sender.getHtmlElementObj();
229229
tempElement = cc.cutRotateImageToCanvas(tempElement, this.getRect());
230230
var tempTexture = new cc.Texture2D();
@@ -297,15 +297,15 @@ cc.SpriteFrame = cc.Class.extend(/** @lends cc.SpriteFrame# */{
297297
* @param {cc.Texture2D} texture
298298
* @param {cc.Rect} rect if parameters' length equal 2, rect in points, else rect in pixels
299299
* @param {Boolean} [rotated=false]
300-
* @param {cc.Point} [offset=cc.size(0,0)]
300+
* @param {cc.Point} [offset=cc.p(0,0)]
301301
* @param {cc.Size} [originalSize=rect.size]
302302
* @return {Boolean}
303303
*/
304304
initWithTexture:function (texture, rect, rotated, offset, originalSize) {
305305
if(arguments.length === 2)
306306
rect = cc.RECT_POINTS_TO_PIXELS(rect);
307307

308-
offset = offset || cc.size(0, 0);
308+
offset = offset || cc.p(0, 0);
309309
originalSize = originalSize || rect.size;
310310

311311
this.setTexture(texture);
@@ -327,14 +327,14 @@ cc.SpriteFrame = cc.Class.extend(/** @lends cc.SpriteFrame# */{
327327
* @param {string} filename
328328
* @param {cc.Rect} rect if parameters' length equal 2, rect in points, else rect in pixels
329329
* @param {Boolean} rotated
330-
* @param {cc.Point} [offset=cc.size(0,0)]
330+
* @param {cc.Point} [offset=cc.p(0,0)]
331331
* @param {cc.Size} [originalSize=rect.size]
332332
*/
333333
initWithTextureFilename:function (filename, rect, rotated, offset, originalSize) {
334334
if(arguments.length === 2)
335335
rect = cc.RECT_POINTS_TO_PIXELS(rect);
336336

337-
offset = offset || cc.size(0, 0);
337+
offset = offset || cc.p(0, 0);
338338
originalSize = originalSize || rect.size;
339339

340340
this._texture = null;

cocos2d/sprite_nodes/CCSpriteFrameCache.js

Lines changed: 80 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@
3333
* cc.SpriteFrameCache.getInstance().addSpriteFrames(s_grossiniPlist);
3434
*/
3535
cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
36-
_spriteFrames:null,
37-
_spriteFramesAliases:null,
38-
_loadedFileNames:null,
36+
_spriteFrames: null,
37+
_spriteFramesAliases: null,
38+
_loadedFileNames: null,
3939

4040
/**
4141
* Constructor
4242
*/
43-
ctor:function () {
43+
ctor: function () {
4444
this._spriteFrames = {};
4545
this._spriteFramesAliases = {};
4646
this._loadedFileNames = [];
@@ -51,17 +51,19 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
5151
* @param {object} dictionary
5252
* @param {cc.Texture2D} texture
5353
*/
54-
_addSpriteFramesWithDictionary:function (dictionary, texture) {
55-
var metadataDict = dictionary["metadata"];
54+
_addSpriteFramesWithDictionary: function (dictionary, texture) {
55+
var metadataDict = dictionary["metadata"] || dictionary["meta"];
5656
var framesDict = dictionary["frames"];
57+
5758
var format = 0;
5859
// get the format
59-
if (metadataDict != null) {
60-
format = parseInt(this._valueForKey("format", metadataDict));
60+
if (metadataDict) {
61+
var tmpFormat = metadataDict["format"];
62+
format = (tmpFormat.length <= 1) ? parseInt(tmpFormat) : tmpFormat;
6163
}
6264

6365
// check the format
64-
if(format < 0 || format > 3) {
66+
if (format < 0 || format > 3) {
6567
cc.log("format is not supported for cc.SpriteFrameCache.addSpriteFramesWithDictionary");
6668
return;
6769
}
@@ -75,14 +77,14 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
7577
}
7678

7779
if (format == 0) {
78-
var x = parseFloat(this._valueForKey("x", frameDict));
79-
var y = parseFloat(this._valueForKey("y", frameDict));
80-
var w = parseFloat(this._valueForKey("width", frameDict));
81-
var h = parseFloat(this._valueForKey("height", frameDict));
82-
var ox = parseFloat(this._valueForKey("offsetX", frameDict));
83-
var oy = parseFloat(this._valueForKey("offsetY", frameDict));
84-
var ow = parseInt(this._valueForKey("originalWidth", frameDict));
85-
var oh = parseInt(this._valueForKey("originalHeight", frameDict));
80+
var x = parseFloat(frameDict["x"]);
81+
var y = parseFloat(frameDict["y"]);
82+
var w = parseFloat(frameDict["width"]);
83+
var h = parseFloat(frameDict["height"]);
84+
var ox = parseFloat(frameDict["offsetX"]);
85+
var oy = parseFloat(frameDict["offsetY"]);
86+
var ow = parseInt(frameDict["originalWidth"]);
87+
var oh = parseInt(frameDict["originalHeight"]);
8688
// check ow/oh
8789
if (!ow || !oh) {
8890
cc.log("cocos2d: WARNING: originalWidth/Height not found on the cc.SpriteFrame. AnchorPoint won't work as expected. Regenrate the .plist");
@@ -93,27 +95,29 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
9395
// create frame
9496
spriteFrame = new cc.SpriteFrame();
9597
spriteFrame.initWithTexture(texture, cc.rect(x, y, w, h), false, cc.p(ox, oy), cc.size(ow, oh));
96-
} else if (format == 1 || format == 2) {
97-
var frame = cc.RectFromString(this._valueForKey("frame", frameDict));
98+
}
99+
else if (format == 1 || format == 2) {
100+
var frame = cc.RectFromString(frameDict["frame"]);
98101
var rotated = false;
99102

100103
// rotation
101104
if (format == 2) {
102-
rotated = this._valueForKey("rotated", frameDict) == "true";
105+
rotated = frameDict["rotated"] == "true";
103106
}
104-
var offset = cc.PointFromString(this._valueForKey("offset", frameDict));
105-
var sourceSize = cc.SizeFromString(this._valueForKey("sourceSize", frameDict));
107+
var offset = cc.PointFromString(frameDict["offset"]);
108+
var sourceSize = cc.SizeFromString(frameDict["sourceSize"]);
106109
// create frame
107110
spriteFrame = new cc.SpriteFrame();
108111
spriteFrame.initWithTexture(texture, frame, rotated, offset, sourceSize);
109-
} else if (format == 3) {
112+
}
113+
else if (format == 3) {
110114
// get values
111115
var spriteSize, spriteOffset, spriteSourceSize, textureRect, textureRotated;
112-
spriteSize = cc.SizeFromString(this._valueForKey("spriteSize", frameDict));
113-
spriteOffset = cc.PointFromString(this._valueForKey("spriteOffset", frameDict));
114-
spriteSourceSize = cc.SizeFromString(this._valueForKey("spriteSourceSize", frameDict));
115-
textureRect = cc.RectFromString(this._valueForKey("textureRect", frameDict));
116-
textureRotated = this._valueForKey("textureRotated", frameDict) == "true";
116+
spriteSize = cc.SizeFromString(frameDict["spriteSize"]);
117+
spriteOffset = cc.PointFromString(frameDict["spriteOffset"]);
118+
spriteSourceSize = cc.SizeFromString(frameDict["spriteSourceSize"]);
119+
textureRect = cc.RectFromString(frameDict["textureRect"]);
120+
textureRotated = frameDict["textureRotated"] == "true";
117121

118122
// get aliases
119123
var aliases = frameDict["aliases"];
@@ -138,11 +142,22 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
138142
spriteFrame.initWithTexture(texture, spriteSize, textureRotated, spriteOffset, spriteSourceSize);
139143
}
140144
}
145+
else {
146+
var filename = frameDict["filename"], tmpFrame = frameDict["frame"], tmpSourceSize = frameDict["sourceSize"];
147+
var jsonFrame = cc.rect(tmpFrame.x, tmpFrame.y, tmpFrame.w, tmpFrame.h);
148+
var jsonRotated = frameDict["rotated"];
149+
var jsonOffset = cc.p(0, 0);
150+
var jsonSourceSize = cc.size(tmpSourceSize.w, tmpSourceSize.h);
141151

142-
if(cc.renderContextType === cc.CANVAS && spriteFrame.isRotated()){
152+
// create frame
153+
spriteFrame = new cc.SpriteFrame();
154+
spriteFrame.initWithTexture(texture, jsonFrame, jsonRotated, jsonOffset, jsonSourceSize);
155+
}
156+
157+
if (cc.renderContextType === cc.CANVAS && spriteFrame.isRotated()) {
143158
//clip to canvas
144159
var locTexture = spriteFrame.getTexture();
145-
if(locTexture.isLoaded()){
160+
if (locTexture.isLoaded()) {
146161
var tempElement = spriteFrame.getTexture().getHtmlElementObj();
147162
tempElement = cc.cutRotateImageToCanvas(tempElement, spriteFrame.getRectInPixels());
148163
var tempTexture = new cc.Texture2D();
@@ -155,73 +170,60 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
155170
}
156171
}
157172

158-
// add sprite frame
159-
this._spriteFrames[key] = spriteFrame;
160-
}
161-
}
162-
},
163173

164-
/**
165-
* Adds multiple Sprite Frames from a json file. A texture will be loaded automatically.
166-
* @param {object} jsonData
167-
* @deprecated
168-
*/
169-
addSpriteFramesWithJson:function (jsonData) {
170-
cc.log("addSpriteFramesWithJson is deprecated, because Json format doesn't support on JSB. Use XML format instead");
171-
var dict = jsonData;
172-
var texturePath = "";
174+
// add sprite frame
175+
var keyName = (filename != null) ? filename : key;
176+
this._spriteFrames[keyName] = spriteFrame;
173177

174-
var metadataDict = dict["metadata"];
175-
if (metadataDict) {
176-
// try to read texture file name from meta data
177-
texturePath = this._valueForKey("textureFileName", metadataDict);
178-
texturePath = texturePath.toString();
179-
}
180178

181-
var texture = cc.TextureCache.getInstance().addImage(texturePath);
182-
if (texture) {
183-
this._addSpriteFramesWithDictionary(dict, texture);
184-
}
185-
else {
186-
cc.log("cocos2d: cc.SpriteFrameCache: Couldn't load texture");
179+
}
187180
}
188181
},
189182

190183
/**
191184
* <p>
192-
* Adds multiple Sprite Frames from a plist file.<br/>
193-
* A texture will be loaded automatically. The texture name will composed by replacing the .plist suffix with .png<br/>
185+
* Adds multiple Sprite Frames from a plist or json file.<br/>
186+
* A texture will be loaded automatically. The texture name will composed by replacing the .plist or .json suffix with .png<br/>
194187
* If you want to use another texture, you should use the addSpriteFrames:texture method.<br/>
195188
* </p>
196-
* @param {String} plist plist filename
189+
* @param {String} filePath file path
197190
* @param {HTMLImageElement|cc.Texture2D|string} texture
198191
* @example
199192
* // add SpriteFrames to SpriteFrameCache With File
200193
* cc.SpriteFrameCache.getInstance().addSpriteFrames(s_grossiniPlist);
194+
* cc.SpriteFrameCache.getInstance().addSpriteFrames(s_grossiniJson);
201195
*/
202-
addSpriteFrames:function (plist, texture) {
203-
if(!plist)
196+
addSpriteFrames: function (filePath, texture) {
197+
if (!filePath)
204198
throw "cc.SpriteFrameCache.addSpriteFrames(): plist should be non-null";
205-
var fileUtils = cc.FileUtils.getInstance();
206-
var fullPath = fileUtils.fullPathForFilename(plist);
207-
var dict = fileUtils.dictionaryWithContentsOfFileThreadSafe(fullPath);
199+
200+
var fileUtils = cc.FileUtils.getInstance(), dict;
201+
var ext = filePath.substr(filePath.lastIndexOf(".", filePath.length) + 1, filePath.length);
202+
if (ext == "plist") {
203+
var fullPath = fileUtils.fullPathForFilename(filePath);
204+
dict = fileUtils.dictionaryWithContentsOfFileThreadSafe(fullPath);
205+
}
206+
else {
207+
dict = JSON.parse(fileUtils.getTextFileData(filePath));
208+
}
208209

209210
switch (arguments.length) {
210211
case 1:
211-
212-
if (!cc.ArrayContainsObject(this._loadedFileNames, plist)) {
212+
if (!cc.ArrayContainsObject(this._loadedFileNames, filePath)) {
213213
var texturePath = "";
214-
var metadataDict = dict["metadata"];
214+
var metadataDict = dict["metadata"] || dict["meta"];
215215
if (metadataDict) {
216216
// try to read texture file name from meta data
217-
texturePath = this._valueForKey("textureFileName", metadataDict).toString();
217+
texturePath = metadataDict["textureFileName"] || metadataDict["image"];
218218
}
219+
219220
if (texturePath != "") {
220221
// build texture path relative to plist file
221-
texturePath = fileUtils.fullPathFromRelativeFile(texturePath, plist);
222+
texturePath = fileUtils.fullPathFromRelativeFile(texturePath, filePath);
223+
222224
} else {
223225
// build texture path by replacing file extension
224-
texturePath = plist;
226+
texturePath = filePath;
225227

226228
// remove .xxx
227229
var startPos = texturePath.lastIndexOf(".", texturePath.length);
@@ -247,7 +249,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
247249
@since v0.99.5
248250
*/
249251
var textureFileName = texture;
250-
if(!textureFileName)
252+
if (!textureFileName)
251253
throw "cc.SpriteFrameCache.addSpriteFrames(): texture name should not be null";
252254
var gTexture = cc.TextureCache.getInstance().addImage(textureFileName);
253255

@@ -271,7 +273,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
271273
* @param {cc.SpriteFrame} frame
272274
* @param {String} frameName
273275
*/
274-
addSpriteFrame:function (frame, frameName) {
276+
addSpriteFrame: function (frame, frameName) {
275277
this._spriteFrames[frameName] = frame;
276278
},
277279

@@ -284,7 +286,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
284286
* In the long term: it will be the same.<br/>
285287
* </p>
286288
*/
287-
removeSpriteFrames:function () {
289+
removeSpriteFrames: function () {
288290
this._spriteFrames = [];
289291
this._spriteFramesAliases = [];
290292
this._loadedFileNames = {};
@@ -294,7 +296,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
294296
* Deletes an sprite frame from the sprite frame cache.
295297
* @param {String} name
296298
*/
297-
removeSpriteFrameByName:function (name) {
299+
removeSpriteFrameByName: function (name) {
298300
// explicit nil handling
299301
if (!name) {
300302
return;
@@ -319,7 +321,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
319321
* </p>
320322
* @param {String} plist plist filename
321323
*/
322-
removeSpriteFramesFromFile:function (plist) {
324+
removeSpriteFramesFromFile: function (plist) {
323325
var fileUtils = cc.FileUtils.getInstance();
324326
var path = fileUtils.fullPathForFilename(plist);
325327
var dict = fileUtils.dictionaryWithContentsOfFileThreadSafe(path);
@@ -336,7 +338,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
336338
* Removes multiple Sprite Frames from Dictionary.
337339
* @param {object} dictionary SpriteFrame of Dictionary
338340
*/
339-
_removeSpriteFramesFromDictionary:function (dictionary) {
341+
_removeSpriteFramesFromDictionary: function (dictionary) {
340342
var framesDict = dictionary["frames"];
341343

342344
for (var key in framesDict) {
@@ -353,7 +355,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
353355
* </p>
354356
* @param {HTMLImageElement|HTMLCanvasElement|cc.Texture2D} texture
355357
*/
356-
removeSpriteFramesFromTexture:function (texture) {
358+
removeSpriteFramesFromTexture: function (texture) {
357359
for (var key in this._spriteFrames) {
358360
var frame = this._spriteFrames[key];
359361
if (frame && (frame.getTexture() == texture)) {
@@ -374,7 +376,7 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
374376
* //get a SpriteFrame by name
375377
* var frame = cc.SpriteFrameCache.getInstance().getSpriteFrame("grossini_dance_01.png");
376378
*/
377-
getSpriteFrame:function (name) {
379+
getSpriteFrame: function (name) {
378380
var frame;
379381
if (this._spriteFrames.hasOwnProperty(name)) {
380382
frame = this._spriteFrames[name];
@@ -396,15 +398,6 @@ cc.SpriteFrameCache = cc.Class.extend(/** @lends cc.SpriteFrameCache# */{
396398
}
397399
}
398400
return frame;
399-
},
400-
401-
_valueForKey:function (key, dict) {
402-
if (dict) {
403-
if (dict.hasOwnProperty(key)) {
404-
return dict[key].toString();
405-
}
406-
}
407-
return "";
408401
}
409402
});
410403

0 commit comments

Comments
 (0)