void ResourceManager::Loadresource()
{
m_vPng.clear();
m_vPlist.clear();
m_vExportJson.clear();
m_vPvr_ccz.clear();
m_vCsb.clear();
auto preLoadDic = __Dictionary::createWithContentsOfFile("gamedata/preloading.plist");
__Dictionary* pngDic = static_cast<__Dictionary*>(preLoadDic->objectForKey("png"));
__Dictionary* plistDic = static_cast<__Dictionary*>(preLoadDic->objectForKey("plist"));
__Dictionary* ExportJsonDic = static_cast<__Dictionary*>(preLoadDic->objectForKey("ExportJson"));
__Dictionary* Pvr_cczDic = static_cast<__Dictionary*>(preLoadDic->objectForKey("pvr_ccz"));
__Dictionary* CsbDir = static_cast<__Dictionary*>(preLoadDic->objectForKey("csb"));
__String* s;
for (unsigned int i=0; i<pngDic->count(); ++i)
{
s = dynamic_cast<__String*>(pngDic->objectForKey(__String::createWithFormat("%d",i+1)->getCString()));
m_vPng.push_back(s->_string);
}
for (unsigned int i=0; i<plistDic->count(); ++i)
{
s = dynamic_cast<__String*>(plistDic->objectForKey(__String::createWithFormat("%d",i+1)->getCString()));
m_vPlist.push_back(s->_string);
}
for (unsigned int i=0; i<ExportJsonDic->count(); ++i)
{
s = dynamic_cast<__String*>(ExportJsonDic->objectForKey(__String::createWithFormat("%d",i+1)->getCString()));
m_vExportJson.push_back(s->_string);
}
for (unsigned int i=0; i<Pvr_cczDic->count(); ++i)
{
s = dynamic_cast<__String*>(Pvr_cczDic->objectForKey(__String::createWithFormat("%d",i+1)->getCString()));
m_vPvr_ccz.push_back(s->_string);
}
for (unsigned int i=0; i<CsbDir->count(); ++i)
{
s = dynamic_cast<__String*>(CsbDir->objectForKey(__String::createWithFormat("%d",i+1)->getCString()));
m_vCsb.push_back(s->_string);
}
//用来处理加载进度条百分比 以及 资源匹配plist
m_iPngNum = 0;
m_iPlistNum = 0;
m_iPvr_cczNum = 0;
m_iExportJsonNum= 0;
m_iCsbNum = 0;
m_iLoadFileNum = 0;
m_iTotalFileNum = m_vPng.size()+ m_vPlist.size()+ m_vExportJson.size()+ m_vPvr_ccz.size()+ m_vCsb.size();
}
//预加载集成 fileName:预加载名字, fileType:预加载类型
void ResourceManager::AsyncTypeResources( const std::string fileName, AsyncType fileType)
{
switch (fileType)
{
case ResourceManager::kPng:
log("AsyncLoading\t\t%s.png", fileName.c_str());
Director::getInstance()->getTextureCache()->addImageAsync(fileName+".png", CC_CALLBACK_1(ResourceManager::imageAsyncCallback, this));
break;
case ResourceManager::kPlist:
log("AsyncLoading\t\t%s.plist", fileName.c_str());
Director::getInstance()->getTextureCache()->addImageAsync(fileName+".png", CC_CALLBACK_1(ResourceManager::plistImageAsyncCallback, this));
break;
case ResourceManager::kPvr_ccz:
log("AsyncLoading\t\t%s.pvr.ccz", fileName.c_str());
Director::getInstance()->getTextureCache()->addImageAsync(fileName+".pvr.ccz", CC_CALLBACK_1(ResourceManager::pvrPlistImageAsyncCallback, this));
break;
case ResourceManager::kJson:
log("AsyncLoading\t\t%s.ExportJson", fileName.c_str());
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(fileName+".ExportJson", this, schedule_selector(ResourceManager::jsonAsyncCallback));
break;
case ResourceManager::kCsb:
log("AsyncLoading\t\t%s.csb", fileName.c_str());
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(fileName+".csb", this, schedule_selector(ResourceManager::csbAsyncCallback));
break;
default:
log("fileName: %s, fileType: %d", fileName.c_str(), fileType);
break;
}
}
void ResourceManager::AsyncLoadGameResouse()
{
for (int i=0; i<m_vPng.size(); ++i)
{
AsyncTypeResources(m_vPng[i].c_str(), AsyncType::kPng);
}
for (int j=0; j<m_vPlist.size(); ++j)
{
AsyncTypeResources(m_vPlist[j].c_str(), AsyncType::kPlist);
}
for (int k=0; k<m_vPvr_ccz.size(); ++k)
{
AsyncTypeResources(m_vPvr_ccz[k].c_str(), AsyncType::kPvr_ccz);
}
for (int l=0; l<m_vExportJson.size(); ++l)
{
AsyncTypeResources(m_vExportJson[l].c_str(), AsyncType::kJson);
}
for (int m=0; m<m_vCsb.size(); ++m)
{
AsyncTypeResources(m_vCsb[m].c_str(), AsyncType::kCsb);
}
}
void ResourceManager::imageAsyncCallback( Ref* pSender )
{
log("AsyncLoadCallBack\t\t%s.png", m_vPng[m_iPngNum].c_str());
++m_iPngNum;
++m_iLoadFileNum;
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
void ResourceManager::plistImageAsyncCallback( cocos2d::Texture2D* texture_ )
{
log("AsyncLoadCallBack\t\t%s.plist", m_vPlist[m_iPlistNum].c_str());
++m_iPlistNum;
++m_iLoadFileNum;
//当全部的plist图片加载完成后,执行plist图片和png图片绑定
if (m_iPlistNum == m_vPlist.size())
{
for (int i=m_vPlist.size()-1; i>=0; --i)
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(m_vPlist[i]+".plist", m_vPlist[i]+".png");
}
}
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
void ResourceManager::pvrPlistImageAsyncCallback( cocos2d::Texture2D* texture_ )
{
log("AsyncLoadCallBack\t\t%s.pvr.ccz", m_vPvr_ccz[m_iPvr_cczNum].c_str());
++m_iPvr_cczNum;
++m_iLoadFileNum;
//当全部的plist图片加载完成后,执行plist图片和pvr_ccz图片绑定
if (m_iPvr_cczNum == m_vPvr_ccz.size())
{
for (int i=m_vPvr_ccz.size()-1; i>=0; --i)
{
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(m_vPvr_ccz[i]+".plist", m_vPvr_ccz[i]+".pvr.ccz");
}
}
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
void ResourceManager::jsonAsyncCallback( float f )
{
log("AsyncLoadCallBack\t\t%s.ExportJson", m_vExportJson[m_iExportJsonNum].c_str());
++m_iExportJsonNum;
++m_iLoadFileNum;
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
void ResourceManager::csbAsyncCallback( float f )
{
log("AsyncLoadCallBack\t\t%s.csb", m_vCsb[m_iCsbNum].c_str());
++m_iCsbNum;
++m_iLoadFileNum;
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
附: preloading.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"/>
<plist version="1.0">
<dict>
<!-- .png 图片预加载 -->
<key>png</key>
<dict>
<key>1</key>
<string>pngName</string>
</dict>
<!-- .plist 图片预加载 -->
<key>plist</key>
<dict>
<key>1</key>
<string>plistName</string>
</dict>
<!-- .pvr.ccz 图片预加载 -->
<key>pvr_ccz</key>
<dict>
<key>1</key>
<string>pvr_cczName</string>
</dict>
<!-- .ExportJson 骨骼动画预加载 -->
<key>ExportJson</key>
<dict>
<key>1</key>
<string>jsonName</string>
</dict>
</dict>
</plist>
刚开始预加载plist的回调是这样的
void ResourceManager::plistImageAsyncCallback( cocos2d::Texture2D* texture_ )
{
log("AsyncLoadCallBack\t\t%s.plist", m_vPlist[m_iPlistNum].c_str());
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(m_vPlist[m_iPlistNum]+".plist", m_vPlist[m_iPlistNum]+".png");
++m_iPlistNum;
++m_iLoadFileNum;
//此处可以设置加载进度百分比
if (m_iLoadFileNum >= m_iTotalFileNum)
{
//此处可以跳转场景
}
}
但是会出现资源匹配错乱的问题, 具体原因不明, 也不想去查了.