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

时间: 2024-10-02 08:57:35

cocos2dx lua中异步加载网络图片,可用于显示微信头像的相关文章

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下:  func setZYHWebImage(url:NSString?, defaultImage:NSString?, isCache:Bool){         var ZYHImage:UIImage?         if url == nil {             return   

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计 在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求. 先来介绍一下我项目中的图文混排的需求:首先我从服

ios开发多线程篇--异步加载网络图片

一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 原因:iOS9.0引入了新特性

ios UIImageView异步加载网络图片

方法1:在UI线程中同步加载网络图片 UIImageView *headview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; NSURL *photourl = [NSURL URLWithString:@"http://www.exampleforphoto.com/pabb/test32.png"]; //url请求实在UI主线程中进行的 UIImage *images = [UIImage ima

cocos2dx 3.3 异步加载纹理

这里以3d场景加载为例,2d情况类似. 先同步加载模型数据和尺寸缩小了100倍的贴图,创建mesh.然后异步加载所有精细纹理并每加载完一个就替换一个,并进入场景. 如此做法的效果是当刚进入场景时看到的是贴图非常糙的场景,然后逐渐贴换为精细贴图.(就像放大谷歌地图时的情况). 下图左边是 刚进入场景时,右边是 精细纹理异步加载完成后:    具体实现如下: bool ClevelMapLayer::init(){ loadAllModelData(); loadAllRoughTex(); cre

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

UIImageView异步加载网络图片

在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下: 去下载https://github.com/rs/SDWebImage放进你的工程里,加入头文件#import "UIImageView+WebCache.h"加载网路图片就一句话[imageView setImageWithURL:url  placeholderImage:[UIImage imageNamed:@"defaultImage.png"]];ima

iOS_第3方类库_EGOImageView异步加载网络图片

异步加载网络图片是很常见的需求 下载,导入,-fno-objc-arc 1.导入头文件 2.创建EGOImageView,并指定占位图,设置url即可 最终效果图:(后补) 附EGO原文件地址:

Android 异步加载网络图片并缓存到本地

在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片. 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,如果下载后就存到本地,下次读取时首先查看本地有没有,如果没有再从网络读取. 记得2月份在和爱奇艺公司的项目总监一起搞联通的OTT盒子的时候他就提了一下软引用,奇艺做的手机客户端就是采用这种方法,所以你会发现奇艺客户端占用很大的空间,下面就分享一下异步加载网络图片的方法吧. FileCache