void GafFeatures::prevSequence( cocos2d::Ref* )
{
    GAFAnimatedObject *object = (GAFAnimatedObject *)m_objects->getObjectAtIndex(0);

    m_currentSequence--;

    if (m_currentSequence < 0)
    {
        m_currentSequence = m_objectSequencesNames.size() - 1;
    }

    const char* secName = m_objectSequencesNames[m_currentSequence].c_str();
    object->playSequence(secName, true);
    
    m_sequenceName->setString(secName);
}
void GafFeatures::addObjectsToScene(int aCount)
{
	if (!aCount)
	{
		return;
	}
	if (!_asset)
	{		
		_asset =  GAFAsset::create(_jsons[_anim_index]);
		CC_SAFE_RETAIN(_asset);
	}
	if (!_objects)
	{
		_objects = CCArray::create();
		_objects->retain();
	}
	if (_asset)
	{
		int initialCount = _objects->count();
		for (int i = initialCount; i < initialCount + aCount; ++i)
		{
			GAFAnimatedObject *object = _asset->createObjectAndRun(true);
			object->setZOrder(100 * i);
			addChild(object);
			float s = CCDirector::sharedDirector()->getWinSize().height / 640;
			if (s > 1) s = 1;
			object->setScale(s);			
			CCSize winSize = CCDirector::sharedDirector()->getWinSize();
			object->setPosition(winSize.width * (0.4 + 0.05 * i), winSize.height * 0.6);
			_objects->addObject(object);
			
			// will work only if animation has sequence
			object->playSequence("walk", true);
		}
	}
}
void GafFeatures::addObjectsToScene()
{
    if (!m_asset)
    {
        StartCounter();
        m_asset = GAFAsset::create(m_files[m_anim_index], this);
        double loadingTime = GetCounter();

        cocos2d::log("Loading time [%f]\n", loadingTime);

        std::ostringstream ss;
        ss << m_files[m_anim_index] << " ";
        ss << loadingTime;

        //m_loadingTimeLabel->setString(ss.str().c_str());
        
        ss.str("");
        
        ss << "VRAM: ";
        ss << m_asset->getTextureAtlas()->getMemoryConsumptionStat();
        ss << " bytes";
        
        m_vramStat->setString(ss.str());
        
        CC_SAFE_RETAIN(m_asset);
    }

    if (!m_objects)
    {
        m_objects = cocos2d::__Array::create();
        m_objects->retain();
    }

    const cocos2d::Size size = cocos2d::Director::getInstance()->getWinSizeInPixels();

    if (m_asset)
    {
        GAFAnimatedObject *object = m_asset->createObject();
        
        object->setLocalZOrder(0);
        addChild(object);
        
        float scaleFactor = cocos2d::Director::getInstance()->getContentScaleFactor();
        object->setPosition(centerScreenPosition(m_asset, size / scaleFactor));
        
        m_objects->addObject(object);
        
        m_objectSequencesNames.clear();
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
        CocosDenshion::SimpleAudioEngine::getInstance()->stopAllEffects();
        
        for(auto& effect : m_musicEffects)
        {
            CocosDenshion::SimpleAudioEngine::getInstance()->unloadEffect(effect.second.c_str());
        }
#endif
        m_musicEffects.clear();
        
        const AnimationSequences_t& secDictionary = m_asset->getAnimationSequences();
        if (!secDictionary.empty())
        {
            for (AnimationSequences_t::const_iterator i = secDictionary.begin(), e = secDictionary.end(); i != e; ++i)
            {
                const std::string& seqName = i->first;
                std::string::size_type pos = seqName.find("__audio:");
                if (pos != std::string::npos)
                {
                    std::string effectName = seqName.substr(pos + 8) + ".wav";
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
                    CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect(effectName.c_str());
#endif
                    m_musicEffects[i->second.startFrameNo] = std::move(effectName);
                }
                else
                {
                    m_objectSequencesNames.push_back(i->first);
                }
            }
        }
        
        enableSequenceControllers(!m_objectSequencesNames.empty());
        
        // will work only if animation has a sequence
        object->playSequence("walk", true);
        object->setLooped(true);
        object->start();
        
        object->setSequenceDelegate(this);
        object->setFramePlayedDelegate(this);
        
    }
}