• 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
    ",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 
    ", "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自己去试试。

  • 相关阅读:
    分页功能
    四个内置对象的作用范围
    include和application
    jsp中的session
    IDC机房的相关常识
    使用dm-cache组合SSD与HDD实现高性价比存储
    负载均衡基本原理与lvs
    秒级别执行脚本的方法
    Tomcat调优
    Nginx调优
  • 原文地址:https://www.cnblogs.com/zijintime/p/7525465.html
Copyright © 2020-2023  润新知