cocos2dx 3.x 异步加载

来源:互联网 发布:淘宝衣服相同钱不一样 编辑:程序博客网 时间:2024/05/18 22:54
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)    {        //此处可以跳转场景    }}

但是会出现资源匹配错乱的问题, 具体原因不明, 也不想去查了.

0 0