cocos2dx lua中異步加載網絡圖片,可用於顯示微信頭像


最近在做一個棋牌項目,腳本語言用的lua,登錄需要使用微信登錄,用戶頭像用微信賬戶的頭像,微信接口返回的頭像是一個url,那么遇到的一個問題就是如何在lua中異步加載這個頭像,先在引擎源碼里找了下可能會提供這個功能的地方,發現好像沒有提供類似功能,那么只能自己動手寫。所以我在ImageView這個類里面添加了一個成員方法,其實可以不寫在ImageView里,而且我覺得非必需情況下還是不要修改引擎源碼的好,因為如果源碼改動比較多的話,將來引擎版本升級會比較麻煩。我寫在ImageView里純粹是想偷懶...

void ImageView::loadTextureFromURL(const char* key,const char* url)
{
    std::string path = FileUtils::getInstance()->getWritablePath();
    path+="cache/";
    path+=key;
    if(FileUtils::getInstance()->isFileExist(path)){
        loadTexture(path);
    }else{
        network::HttpRequest* request = new (std::nothrow) network::HttpRequest();
        request->setUrl(url);
        request->setRequestType(network::HttpRequest::Type::GET);
        request->setResponseCallback([this,path](network::HttpClient* client, network::HttpResponse* response){
            if (!response->isSucceed())
            {
                CCLOG("Receive Error! %s\n",response->getErrorBuffer());
                return ;
            }
            std::vector<char> *buffer = response->getResponseData();
            CCLOG("path: %s",path.c_str());
            std::string bufffff(buffer->begin(),buffer->end());
            FILE *fp = fopen(path.c_str(), "wb+");
            fwrite(bufffff.c_str(), 1,buffer->size(),fp); 
            fclose(fp);
            loadTexture(path);
        });
        network::HttpClient::getInstance()->sendImmediate(request);
        request->release();
    }
}

先在ImageView添加一個公有方法,需要的兩個參數一個是唯一標志這個頭像的key(可以用用戶id),和頭像的url,緩存路徑我選擇在可寫路徑下新建一個cache文件夾來專門放緩存的頭像。

下面要將方法暴露到lua層

找到這個lua_cocos2dx_ui_auto.cpp,在里面添加一個方法

int lua_cocos2dx_ui_ImageView_loadTextureFromURL(lua_State* tolua_S)
{
    int argc = 0;
    cocos2d::ui::ImageView* cobj = nullptr;
    bool ok  = true;
    
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif
    
    
#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertype(tolua_S,1,"ccui.ImageView",0,&tolua_err)) goto tolua_lerror;
#endif
    
    cobj = (cocos2d::ui::ImageView*)tolua_tousertype(tolua_S,1,0);
    
#if COCOS2D_DEBUG >= 1
    if (!cobj)
    {
        tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'", nullptr);
        return 0;
    }
#endif
    
    argc = lua_gettop(tolua_S)-1;
    if (argc == 2)
    {
        std::string arg0;
        std::string arg1;
        
        ok &= luaval_to_std_string(tolua_S, 2,&arg0, "ccui.ImageView:loadTextureFromURL");
        ok &= luaval_to_std_string(tolua_S, 3,&arg1, "ccui.ImageView:loadTextureFromURL");
        if(!ok)
        {
            tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'", nullptr);
            return 0;
        }
        cobj->loadTextureFromURL(arg0.c_str(),arg1.c_str());
        lua_settop(tolua_S, 1);
        return 1;
    }
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ImageView:loadTextureFromURL",argc, 1);
    return 0;
    
#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'.",&tolua_err);
#endif
    
    return 0;
}

然后,還是在這個文件中

 

編譯之后,在lua里面就可以正常使用了,比如

headImage:loadTextureFromURL(data.account.uuid.."",data.account.headicon);

headImage是用來顯示頭像的ImageView控件,可以先放一張默認頭像的圖片,然后異步加載真實頭像,uuid是一個用戶的唯一標識,headicon是頭像url.

另外再說一下微信返回的頭像默認大小好像是512*512的,太大了,我們只需要將url最后改成96,就可以得到96*96的頭像,對於我的項目來說96剛剛好,你需要哪個尺寸,可以用那個url自己去試試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM