/************************************************************************/ /* 预先加载一些生物以备将来使用 */ /* 专门用来缓存生物用的 */ /* 使用时通过生物ID或者名字来查找对象 */ /************************************************************************/ #ifndef __BIONTCACHE_H__ #define __BIONTCACHE_H__ #include "GameFrameHead.h" class CBiont; class GAMEFRAME_API CBiontCache { public: ~CBiontCache(); static CBiontCache* getInstance(); static void destroy(); void init(); void addBiont(int nType, CBiont* pBiont); vector<CBiont*> getBionts(int nType); CBiont* getBiontById(int nId); //获取一种生物 不够数拷贝 //vector<CBiont*> getBiontKind(int nType, int nAmount); unsigned int getBiontKindSize(); void releas(); void setParentLayer(CCNode* pLayer, int zOrder = 1); ////////////////////////////////////////////////////////////////////////// //没有添加到引用计数里(需要手动释放),调用这些函数释放 void removeAll(); void removeVecBiont(int nType); void removeBiont(int nId); private: CBiontCache(); static CBiontCache* g_pBiontCache; map<int, vector<CBiont*> > m_mapVecBion; //生物群字典(以类型为键) CCNode* m_pParentLayer; }; #endif //__BIONTCACHE_H__
#include "BiontCache.h" #include "Biont.h" CBiontCache* CBiontCache::g_pBiontCache = NULL; CBiontCache::CBiontCache() { m_mapVecBion.clear(); m_pParentLayer = NULL; } CBiontCache::~CBiontCache() { } CBiontCache* CBiontCache::getInstance() { if (!g_pBiontCache) { g_pBiontCache = new CBiontCache(); ASSERT(g_pBiontCache); } return g_pBiontCache; } void CBiontCache::destroy() { SAFE_DELETE(g_pBiontCache); } void CBiontCache::init() { } vector<CBiont*> CBiontCache::getBionts( int nType ) { return m_mapVecBion.find(nType)->second; } void CBiontCache::releas() { this->removeAll(); } void CBiontCache::addBiont( int nType, CBiont* pBiont ) { ASSERT(pBiont); //判断存在已有的键 for(map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { if (it->first == pBiont->getType()) { ((*it).second).push_back(pBiont); return; //跳出 } } //没有就创建新键 vector<CBiont*> vecBiont; vecBiont.push_back(pBiont); m_mapVecBion[nType] = vecBiont; } void CBiontCache::removeAll() { for (map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { for (vector<CBiont*>::iterator biontIt = (it->second).begin(); biontIt != (it->second).end(); biontIt++) { (*biontIt)->removeAllChildrenWithCleanup(true); (*biontIt)->removeFromParentAndCleanup(true); SAFE_DELETE(*biontIt); } (it->second).clear(); } } void CBiontCache::removeVecBiont( int nType ) { for (map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { if (it->first == nType) { for (vector<CBiont*>::iterator vceBiontIt = (it->second).begin(); vceBiontIt != (it->second).end(); vceBiontIt++) { SAFE_DELETE(*vceBiontIt); } (it->second).clear(); break; } } } void CBiontCache::removeBiont( int nId ) { for (map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { for (vector<CBiont*>::iterator vecBiontIt = (it->second).begin(); vecBiontIt != (it->second).end(); vecBiontIt++) { if ((*vecBiontIt)->getId() == nId) { SAFE_DELETE(*vecBiontIt); break; } } } } unsigned int CBiontCache::getBiontKindSize() { return m_mapVecBion.size(); } void CBiontCache::setParentLayer( CCNode* pLayer, int zOrder /*= 1*/ ) { ASSERT(pLayer); for (map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { for (vector<CBiont*>::iterator vecBiontIt = (it->second).begin(); vecBiontIt != (it->second).end(); vecBiontIt++) { if (*vecBiontIt) { if ((*vecBiontIt)->getParent()) { m_pParentLayer->removeChild(*vecBiontIt, false); } pLayer->addChild(*vecBiontIt, zOrder); } } } m_pParentLayer = pLayer; } CBiont* CBiontCache::getBiontById( int nId ) { for (map<int, vector<CBiont*> >::iterator it = m_mapVecBion.begin(); it != m_mapVecBion.end(); it++) { for (vector<CBiont*>::iterator vecBiontIt = (it->second).begin(); vecBiontIt != (it->second).end(); vecBiontIt++) { if ((*vecBiontIt)->getId() == nId) { return *vecBiontIt; } } } CCLog("error: CBiontCache::getBiontById"); return NULL; }