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; }
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); }