Different plists/pngs and but with the same frame names?

Hello,
I am having trouble having multiple sprites, using the same different images. With the same frame names.

sprite 1 = "girl.png", "girl.plist" sprite 2 = "boy.png", "boy.plist"

girl.plist and boy.plist reference their seperate textures.
girl.plist and boy.plist habe the SAME sprite names. Their spritesheets are different textures but with the same naming convension.

for exampple…

"run.png" in girl.plist = girl running. "run.png" in boy.plist = boyrunning.

If i load both girl.png, girl.plist and boyrunning.png, boyrunning.plist

` cc.SpriteFrameCache.getInstance().addSpriteFrames(plist);
var texture = cc.TextureCache.getInstance().addImage(image);

    var sprite = cc.Sprite.create(image);`

Something like the above.

Then i want to to make the boy run, and the girl run.

` var frame = cc.SpriteFrameCache.getInstance().getSpriteFrame(“run.png”);

girlSorite.SetDisplayFrame(frame); ==becomes girl run.png
boySorite.SetDisplayFrame(frame); ==becomes girl run.png
`

They will BOTH change to the SAME sprite / girl.

How can i have two separate plists with two separate images that share a similar naming convention in their sprite names?

i want
girlSorite.SetDisplayFrame(frame); == becomes girl run.png
boySorite.SetDisplayFrame(frame); == becomes BOY run.png

I think i have the same problem as here

http://www.cocos2d-iphone.org/forums/topic/help-sharedspriteframecache-returns-a-sprite-for-the-wrong-texture/

`So I guess what I don’t get, is I add a sprite sheet via plist/png. This gives me a bunch of sprite frames in the frame cache. I can get those frames by name, no problem.

Then, I add a second sprite sheet, with a different plist/png. This gives me even more in the frame cache, but in my case, a lot of them have duplicate name entries compared to the first set. Now, it seems that behavior is undefined when I try and get the frames by name?`

So 2 solutions offered, edit the spriteCache file

or

rename every frame in the plists…WHAT???

OR

is it possible in html to have more than one spriteframecache , individual to the sprite?

I face the same problem but I don’t want to have boy_run.png and girl_run.png .

Anybody find solution ?!?!?!?!

var FrameCache ={
    _CCNS_REG1 : /^\s*\{\s*([\-]?\d+[.]?\d*)\s*,\s*([\-]?\d+[.]?\d*)\s*\}\s*$/,
    _CCNS_REG2 : /^\s*\{\s*\{\s*([\-]?\d+[.]?\d*)\s*,\s*([\-]?\d+[.]?\d*)\s*\}\s*,\s*\{\s*([\-]?\d+[.]?\d*)\s*,\s*([\-]?\d+[.]?\d*)\s*\}\s*\}\s*$/,

    _spriteFrames: {},
    _spriteFramesAliases: {},
    _frameConfigCache : {},

    _rectFromString :  function (content) {
        var result = this._CCNS_REG2.exec(content);
        if(!result) return cc.rect(0, 0, 0, 0);
        return cc.rect(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]), parseFloat(result[4]));
    },

    _pointFromString : function (content) {
        var result = this._CCNS_REG1.exec(content);
        if(!result) return cc.p(0,0);
        return cc.p(parseFloat(result[1]), parseFloat(result[2]));
    },

    _sizeFromString : function (content) {
        var result = this._CCNS_REG1.exec(content);
        if(!result) return cc.size(0, 0);
        return cc.size(parseFloat(result[1]), parseFloat(result[2]));
    },

    _getFrameConfig : function(url){
        var dict = cc.loader.getRes(url);
        cc.assert(dict, cc._LogInfos.spriteFrameCache__getFrameConfig_2, url);
        cc.loader.release(url);//release it in loader
        if(dict._inited){
            this._frameConfigCache[url] = dict;
            return dict;
        }
        this._frameConfigCache[url] = this._parseFrameConfig(dict);
        return this._frameConfigCache[url];
    },

    _parseFrameConfig: function(dict) {
        var tempFrames = dict["frames"], tempMeta = dict["metadata"] || dict["meta"];
        var frames = {}, meta = {};
        var format = 0;
        if(tempMeta){//init meta
            var tmpFormat = tempMeta["format"];
            format = (tmpFormat.length <= 1) ? parseInt(tmpFormat) : tmpFormat;
            meta.image = tempMeta["textureFileName"] || tempMeta["textureFileName"] || tempMeta["image"];
        }
        for (var key in tempFrames) {
            var frameDict = tempFrames[key];
            if(!frameDict) continue;
            var tempFrame = {};

            if (format == 0) {
                tempFrame.rect = cc.rect(frameDict["x"], frameDict["y"], frameDict["width"], frameDict["height"]);
                tempFrame.rotated = false;
                tempFrame.offset = cc.p(frameDict["offsetX"], frameDict["offsetY"]);
                var ow = frameDict["originalWidth"];
                var oh = frameDict["originalHeight"];
                // check ow/oh
                if (!ow || !oh) {
                    cc.log(cc._LogInfos.spriteFrameCache__getFrameConfig);
                }
                // Math.abs ow/oh
                ow = Math.abs(ow);
                oh = Math.abs(oh);
                tempFrame.size = cc.size(ow, oh);
            } else if (format == 1 || format == 2) {
                tempFrame.rect = this._rectFromString(frameDict["frame"]);
                tempFrame.rotated = frameDict["rotated"] || false;
                tempFrame.offset = this._pointFromString(frameDict["offset"]);
                tempFrame.size = this._sizeFromString(frameDict["sourceSize"]);
            } else if (format == 3) {
                // get values
                var spriteSize = this._sizeFromString(frameDict["spriteSize"]);
                var textureRect = this._rectFromString(frameDict["textureRect"]);
                if (spriteSize) {
                    textureRect = cc.rect(textureRect.x, textureRect.y, spriteSize.width, spriteSize.height);
                }
                tempFrame.rect = textureRect;
                tempFrame.rotated = frameDict["textureRotated"] || false; // == "true";
                tempFrame.offset = this._pointFromString(frameDict["spriteOffset"]);
                tempFrame.size = this._sizeFromString(frameDict["spriteSourceSize"]);
                tempFrame.aliases = frameDict["aliases"];
            } else {
                var tmpFrame = frameDict["frame"], tmpSourceSize = frameDict["sourceSize"];
                key = frameDict["filename"] || key;
                tempFrame.rect = cc.rect(tmpFrame["x"], tmpFrame["y"], tmpFrame["w"], tmpFrame["h"]);
                tempFrame.rotated = frameDict["rotated"] || false;
                tempFrame.offset = cc.p(0, 0);
                tempFrame.size = cc.size(tmpSourceSize["w"], tmpSourceSize["h"]);
            }
            frames[key] = tempFrame;
        }
        return {_inited: true, frames: frames, meta: meta};
    },


    _createSpriteFrames: function(headkey,url, frameConfig, texture) {
        var frames = frameConfig.frames, meta = frameConfig.meta;
        if(!texture){
            var texturePath = cc.path.changeBasename(url, meta.image || ".png");
            texture = cc.textureCache.addImage(texturePath);
        }else if(texture instanceof cc.Texture2D){
            //do nothing
        }else if(cc.isString(texture)){//string
            texture = cc.textureCache.addImage(texture);
        }else{
            cc.assert(0, cc._LogInfos.spriteFrameCache_addSpriteFrames_3);
        }

        //create sprite frames
        var spAliases = this._spriteFramesAliases, spriteFrames = this._spriteFrames;
        for (var key in frames) {
            var frame = frames[key];
            var spriteFrame = spriteFrames[key];
            if (!spriteFrame) {
                spriteFrame = new cc.SpriteFrame(texture, frame.rect, frame.rotated, frame.offset, frame.size);
                var aliases = frame.aliases;
                if(aliases){//set aliases
                    for(var i = 0, li = aliases.length; i < li; i++){
                        var alias = aliases[i];
                        if (spAliases[alias])
                            cc.log(cc._LogInfos.spriteFrameCache_addSpriteFrames, alias);
                        spAliases[alias] = key;
                    }
                }

                if (cc._renderType === cc.game.RENDER_TYPE_CANVAS && spriteFrame.isRotated()) {
                    //clip to canvas
                    var locTexture = spriteFrame.getTexture();
                    if (locTexture.isLoaded()) {
                        var tempElement = spriteFrame.getTexture().getHtmlElementObj();
                        tempElement = cc.Sprite.CanvasRenderCmd._cutRotateImageToCanvas(tempElement, spriteFrame.getRectInPixels());
                        var tempTexture = new cc.Texture2D();
                        tempTexture.initWithElement(tempElement);
                        tempTexture.handleLoadedTexture();
                        spriteFrame.setTexture(tempTexture);

                        var rect = spriteFrame._rect;
                        spriteFrame.setRect(cc.rect(0, 0, rect.width, rect.height));
                    }
                }
                if(!spriteFrames[headkey])spriteFrames[headkey]={};
                spriteFrames[headkey][key] = spriteFrame;
            }
        }
    },

    replaceSpriteFrames:function(headkey,url,texture){
        cc.assert(url, cc._LogInfos.spriteFrameCache_addSpriteFrames_2);
        //Is it a SpriteFrame plist?
        var dict = this._frameConfigCache[url] || cc.loader.getRes(url);
        if(!dict || !dict["frames"])
            return;
        var frameConfig = this._frameConfigCache[url] || this._getFrameConfig(url);
        this._createSpriteFrames(headkey,url, frameConfig, texture);
    },

    addSpriteFrames: function (headkey,url, texture) {
        cc.assert(url, cc._LogInfos.spriteFrameCache_addSpriteFrames_2);
        //Is it a SpriteFrame plist?
        var dict = this._frameConfigCache[url] || cc.loader.getRes(url);
        if(!dict || !dict["frames"])
            return;
        var frameConfig = this._frameConfigCache[url] || this._getFrameConfig(url);
        this._createSpriteFrames(headkey,url, frameConfig, texture);
    },

    getSpriteFrame: function (headkey,name) {
        var self = this;
        return self._spriteFrames[headkey][name];
    },

	_clear: function () {
		this._spriteFrames = {};
		this._spriteFramesAliases = {};
		this._frameConfigCache = {};
	}
};

use this as

FrameCache.addSpriteFrames(me.id,res[me.id].plist,res[me.id].png);//headkey plist png
hum.setSpriteFrame(FrameCache.getSpriteFrame(me.id,me.id+'_'+this.face + '_run_0.png'));

As far as I know sprite frames need to have unique names. Before adding images to a spritesheet I give them a unique prefix, or use consistent naming. On mac it’s easy to do, you can batch rename files in the finder. Or if you’re using texture packer you can add the directory name to the names in the spritesheet.