void SpriteFrameCacheHelper::addSpriteFrameFromDict(CCDictionary* dictionary, CCTexture2D *pobTexture, const char *_imagePath) { /* Supported Zwoptex Formats: ZWTCoordinatesFormatOptionXMLLegacy = 0, // Flash Version ZWTCoordinatesFormatOptionXML1_0 = 1, // Desktop Version 0.0 - 0.4b ZWTCoordinatesFormatOptionXML1_1 = 2, // Desktop Version 1.0.0 - 1.0.1 ZWTCoordinatesFormatOptionXML1_2 = 3, // Desktop Version 1.0.2+ */ CCDictionary *metadataDict = (CCDictionary*)dictionary->objectForKey("metadata"); CCDictionary *framesDict = (CCDictionary*)dictionary->objectForKey("frames"); int format = 0; // get the format if(metadataDict != NULL) { format = metadataDict->valueForKey("format")->intValue(); } // check the format CCAssert(format >=0 && format <= 3, "format is not supported for CCSpriteFrameCache addSpriteFramesWithDictionary:textureFilename:"); CCDictElement* pElement = NULL; CCDICT_FOREACH(framesDict, pElement) { CCDictionary* frameDict = (CCDictionary*)pElement->getObject(); std::string spriteFrameName = pElement->getStrKey(); m_Display2ImageMap[spriteFrameName] = _imagePath; //CCLog("spriteFrameName : %s, imagePath : %s", spriteFrameName.c_str(), _imagePath); CCSpriteFrame* spriteFrame = (CCSpriteFrame*)CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(spriteFrameName.c_str()); if (spriteFrame) { continue; } if(format == 0) { float x = frameDict->valueForKey("x")->floatValue(); float y = frameDict->valueForKey("y")->floatValue(); float w = frameDict->valueForKey("width")->floatValue(); float h = frameDict->valueForKey("height")->floatValue(); float ox = frameDict->valueForKey("offsetX")->floatValue(); float oy = frameDict->valueForKey("offsetY")->floatValue(); int ow = frameDict->valueForKey("originalWidth")->intValue(); int oh = frameDict->valueForKey("originalHeight")->intValue(); // check ow/oh if(!ow || !oh) { CCLOG("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenrate the .plist"); } // abs ow/oh ow = abs(ow); oh = abs(oh); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, CCRectMake(x, y, w, h), false, CCPointMake(ox, oy), CCSizeMake((float)ow, (float)oh) ); } else if(format == 1 || format == 2) { CCRect frame = CCRectFromString(frameDict->valueForKey("frame")->getCString()); bool rotated = false; // rotation if (format == 2) { rotated = frameDict->valueForKey("rotated")->boolValue(); } CCPoint offset = CCPointFromString(frameDict->valueForKey("offset")->getCString()); CCSize sourceSize = CCSizeFromString(frameDict->valueForKey("sourceSize")->getCString()); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, frame, rotated, offset, sourceSize ); } else if (format == 3) { } // add sprite frame CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrame(spriteFrame, spriteFrameName.c_str()); spriteFrame->release(); }
void CCSpriteFrameCache::addSpriteFramesWithDictionary(CCDictionary<std::string, CCObject*> *dictionary, CCTexture2D *pobTexture) { /* Supported Zwoptex Formats: ZWTCoordinatesFormatOptionXMLLegacy = 0, // Flash Version ZWTCoordinatesFormatOptionXML1_0 = 1, // Desktop Version 0.0 - 0.4b ZWTCoordinatesFormatOptionXML1_1 = 2, // Desktop Version 1.0.0 - 1.0.1 ZWTCoordinatesFormatOptionXML1_2 = 3, // Desktop Version 1.0.2+ */ CCDictionary<std::string, CCObject*> *metadataDict = (CCDictionary<std::string, CCObject*>*)dictionary->objectForKey(std::string("metadata")); CCDictionary<std::string, CCObject*> *framesDict = (CCDictionary<std::string, CCObject*>*)dictionary->objectForKey(std::string("frames")); int format = 0; // get the format if(metadataDict != NULL) { format = atoi(valueForKey("format", metadataDict)); } // check the format CCAssert(format >=0 && format <= 3, ""); framesDict->begin(); std::string key = ""; CCDictionary<std::string, CCObject*> *frameDict = NULL; while( (frameDict = (CCDictionary<std::string, CCObject*>*)framesDict->next(&key)) ) { CCSpriteFrame *spriteFrame = m_pSpriteFrames->objectForKey(key); if (spriteFrame) { continue; } if(format == 0) { float x = (float)atof(valueForKey("x", frameDict)); float y = (float)atof(valueForKey("y", frameDict)); float w = (float)atof(valueForKey("width", frameDict)); float h = (float)atof(valueForKey("height", frameDict)); float ox = (float)atof(valueForKey("offsetX", frameDict)); float oy = (float)atof(valueForKey("offsetY", frameDict)); int ow = atoi(valueForKey("originalWidth", frameDict)); int oh = atoi(valueForKey("originalHeight", frameDict)); // check ow/oh if(!ow || !oh) { CCLOG("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenrate the .plist"); } // abs ow/oh ow = abs(ow); oh = abs(oh); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, CCRectMake(x, y, w, h), false, CCPointMake(ox, oy), CCSizeMake((float)ow, (float)oh) ); } else if(format == 1 || format == 2) { CCRect frame = CCRectFromString(valueForKey("frame", frameDict)); bool rotated = false; // rotation if (format == 2) { rotated = atoi(valueForKey("rotated", frameDict)) == 0 ? false : true; } CCPoint offset = CCPointFromString(valueForKey("offset", frameDict)); CCSize sourceSize = CCSizeFromString(valueForKey("sourceSize", frameDict)); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, frame, rotated, offset, sourceSize ); } else if (format == 3) { // get values CCSize spriteSize = CCSizeFromString(valueForKey("spriteSize", frameDict)); CCPoint spriteOffset = CCPointFromString(valueForKey("spriteOffset", frameDict)); CCSize spriteSourceSize = CCSizeFromString(valueForKey("spriteSourceSize", frameDict)); CCRect textureRect = CCRectFromString(valueForKey("textureRect", frameDict)); bool textureRotated = atoi(valueForKey("textureRotated", frameDict)) == 0 ? false : true; // get aliases CCMutableArray<CCString*> *aliases = (CCMutableArray<CCString*> *) (frameDict->objectForKey(std::string("aliases"))); CCMutableArray<CCString*>::CCMutableArrayIterator iter; CCString * frameKey = new CCString(key.c_str()); for (iter = aliases->begin(); iter != aliases->end(); ++iter) { std::string oneAlias = ((CCString*) (*iter))->m_sString; if (m_pSpriteFramesAliases->objectForKey(oneAlias)) { CCLOG("cocos2d: WARNING: an alias with name %s already exists", oneAlias.c_str()); } m_pSpriteFramesAliases->setObject(frameKey, oneAlias); } frameKey->release(); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, CCRectMake(textureRect.origin.x, textureRect.origin.y, spriteSize.width, spriteSize.height), textureRotated, spriteOffset, spriteSourceSize); } // add sprite frame m_pSpriteFrames->setObject(spriteFrame, key); spriteFrame->release(); } }
bool CCPreLoad::cacheFramesForPlist(const char* plist, const char* textureFileName) { bool ret = false; do{ //private权限不好继承,直接挑出来改,Zwoptex.swf 1.0的version CCTexture2D *pobTexture = CCTextureCache::sharedTextureCache()->addImage(textureFileName); if(pobTexture == NULL) break; string pszPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(plist); CCDictionary *dictionary = CCDictionary::createWithContentsOfFileThreadSafe(pszPath.c_str()); CCDictionary *framesDict = (CCDictionary*)dictionary->objectForKey("frames"); int format = 0; CCDictElement* pElement = NULL; CCDICT_FOREACH(framesDict, pElement) { CCDictionary* frameDict = (CCDictionary*)pElement->getObject(); std::string spriteFrameName = pElement->getStrKey(); CCSpriteFrame* spriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(spriteFrameName.c_str()); if (spriteFrame) { continue; } int format = 0;//就只挑这个 if(format == 0) { float x = frameDict->valueForKey("x")->floatValue(); float y = frameDict->valueForKey("y")->floatValue(); float w = frameDict->valueForKey("width")->floatValue(); float h = frameDict->valueForKey("height")->floatValue(); float ox = frameDict->valueForKey("offsetX")->floatValue(); float oy = frameDict->valueForKey("offsetY")->floatValue(); int ow = frameDict->valueForKey("originalWidth")->intValue(); int oh = frameDict->valueForKey("originalHeight")->intValue(); // check ow/oh if(!ow || !oh) { CCLOGWARN("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenrate the .plist"); } // abs ow/oh ow = abs(ow); oh = abs(oh); // create frame spriteFrame = new CCSpriteFrame(); spriteFrame->initWithTexture(pobTexture, CCRectMake(x, y, w, h), false, CCPointMake(ox, oy), CCSizeMake((float)ow, (float)oh) ); } // add sprite frame CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrame(spriteFrame, spriteFrameName.c_str()); m_tmpFrames.insert(make_pair(spriteFrameName,spriteFrame)); spriteFrame->release(); } dictionary->release(); ret = true; }while(0);