cocos2dx 3.x 异步加载

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值