void AnimationCache::parseVersion2(const ValueMap& animations) { SpriteFrameCache *frameCache = SpriteFrameCache::getInstance(); for (auto iter = animations.cbegin(); iter != animations.cend(); ++iter) { std::string name = iter->first; ValueMap& animationDict = const_cast<ValueMap&>(iter->second.asValueMap()); const Value& loops = animationDict["loops"]; bool restoreOriginalFrame = animationDict["restoreOriginalFrame"].asBool(); ValueVector& frameArray = animationDict["frames"].asValueVector(); if ( frameArray.empty() ) { CCLOG("cocos2d: AnimationCache: Animation '%s' found in dictionary without any frames - cannot add to animation cache.", name.c_str()); continue; } // Array of AnimationFrames Vector<AnimationFrame*> array(static_cast<int>(frameArray.size())); for (auto& obj : frameArray) { ValueMap& entry = obj.asValueMap(); std::string spriteFrameName = entry["spriteframe"].asString(); SpriteFrame *spriteFrame = frameCache->getSpriteFrameByName(spriteFrameName); if( ! spriteFrame ) { CCLOG("cocos2d: AnimationCache: Animation '%s' refers to frame '%s' which is not currently in the SpriteFrameCache. This frame will not be added to the animation.", name.c_str(), spriteFrameName.c_str()); continue; } float delayUnits = entry["delayUnits"].asFloat(); Value& userInfo = entry["notification"]; AnimationFrame *animFrame = AnimationFrame::create(spriteFrame, delayUnits, userInfo.getType() == Value::Type::MAP ? userInfo.asValueMap() : ValueMapNull); array.pushBack(animFrame); } float delayPerUnit = animationDict["delayPerUnit"].asFloat(); Animation *animation = Animation::create(array, delayPerUnit, loops.getType() != Value::Type::NONE ? loops.asInt() : 1); animation->setRestoreOriginalFrame(restoreOriginalFrame); AnimationCache::getInstance()->addAnimation(animation, name); } }
void AnimationCache::parseVersion1(const ValueMap& animations) { SpriteFrameCache *frameCache = SpriteFrameCache::getInstance(); for (auto iter = animations.cbegin(); iter != animations.cend(); ++iter) { const ValueMap& animationDict = iter->second.asValueMap(); const ValueVector& frameNames = animationDict.at("frames").asValueVector(); float delay = animationDict.at("delay").asFloat(); Animation* animation = nullptr; if ( frameNames.empty() ) { CCLOG("cocos2d: AnimationCache: Animation '%s' found in dictionary without any frames - cannot add to animation cache.", iter->first.c_str()); continue; } ssize_t frameNameSize = frameNames.size(); Vector<AnimationFrame*> frames(frameNameSize); for (auto& frameName : frameNames) { SpriteFrame* spriteFrame = frameCache->getSpriteFrameByName(frameName.asString()); if ( ! spriteFrame ) { CCLOG("cocos2d: AnimationCache: Animation '%s' refers to frame '%s' which is not currently in the SpriteFrameCache. This frame will not be added to the animation.", iter->first.c_str(), frameName.asString().c_str()); continue; } AnimationFrame* animFrame = AnimationFrame::create(spriteFrame, 1, ValueMap()); frames.pushBack(animFrame); } if ( frames.empty() ) { CCLOG("cocos2d: AnimationCache: None of the frames for animation '%s' were found in the SpriteFrameCache. Animation is not being added to the Animation Cache.", iter->first.c_str()); continue; } else if ( frames.size() != frameNameSize ) { CCLOG("cocos2d: AnimationCache: An animation in your dictionary refers to a frame which is not in the SpriteFrameCache. Some or all of the frames for the animation '%s' may be missing.", iter->first.c_str()); } animation = Animation::create(frames, delay, 1); AnimationCache::getInstance()->addAnimation(animation, iter->first.c_str()); } }
void SpriteFrameCache::removeSpriteFramesFromDictionary(ValueMap& dictionary) { ValueMap framesDict = dictionary["frames"].asValueMap(); std::vector<std::string> keysToRemove; for (auto iter = framesDict.cbegin(); iter != framesDict.cend(); ++iter) { if (_spriteFrames.at(iter->first)) { keysToRemove.push_back(iter->first); } } _spriteFrames.erase(keysToRemove); }