예제 #1
0
CCParticleSystem* ADParticleSystemCache::addParticleSystem( const char *pFileName )
{
	CCParticleSystem *pRetPart = NULL;
	ParticleSystemBatchMap::iterator iter = m_particleBatchesIdle.find( pFileName );
	if( iter == m_particleBatchesIdle.end() )
	{
		pRetPart = CCParticleSystemQuad::create( pFileName );
		CCParticleBatchNode *pNode = CCParticleBatchNode::createWithTexture( pRetPart->getTexture(), 100 );
		m_pRootNode->addChild( pNode );
		pNode->addChild( pRetPart );

		m_particleBatchesUsed[pFileName]._pBatchNode = pNode;

		m_particleBatchesIdle[pFileName]._pBatchNode = pNode;
	}
	else
	{
		if( iter->second._particleSystems.empty() )
		{
			pRetPart = _createNewParticleSystem( pFileName, iter->second._pBatchNode );
			iter->second._particleSystems.push_back( pRetPart );
		}
		else
		{
			pRetPart = iter->second._particleSystems.front();
			iter->second._particleSystems.pop_front();
		}
	}

	CCAssert( pRetPart != NULL, " add particle system error " );

	m_particleBatchesUsed[pFileName]._particleSystems.push_back( pRetPart );

	return pRetPart;
}
예제 #2
0
void CCParticleBatchNode::addChild(CCNode * child, int zOrder, int tag)
{
    CCAssert( child != NULL, "Argument must be non-NULL");
    CCAssert( dynamic_cast<CCParticleSystem*>(child) != NULL, "CCParticleBatchNode only supports CCQuadParticleSystems as children");
    CCParticleSystem* pChild = (CCParticleSystem*)child;
    CCAssert( pChild->getTexture()->getName() == m_pTextureAtlas->getTexture()->getName(), "CCParticleSystem is not using the same texture id");
    // If this is the 1st children, then copy blending function
    if( m_pChildren->count() == 0 ) 
    {
        setBlendFunc(pChild->getBlendFunc());
    }

    CCAssert( m_tBlendFunc.src  == pChild->getBlendFunc().src && m_tBlendFunc.dst  == pChild->getBlendFunc().dst, "Can't add a PaticleSystem that uses a different blending function");

    //no lazy sorting, so don't call super addChild, call helper instead
    unsigned int pos = addChildHelper(pChild,zOrder,tag);

    //get new atlasIndex
    unsigned int atlasIndex = 0;

    if (pos != 0) 
    {
        CCParticleSystem* p = (CCParticleSystem*)m_pChildren->objectAtIndex(pos-1);
        atlasIndex = p->getAtlasIndex() + p->getTotalParticles();

    }
    else
    {
        atlasIndex = 0;
    }

    insertChild(pChild, atlasIndex);

    // update quad info
    pChild->setBatchNode(this);
}