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(), ,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 = ;
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,,"ccui.ImageView",,&tolua_err)) goto tolua_lerror;
#endif cobj = (cocos2d::ui::ImageView*)tolua_tousertype(tolua_S,,); #if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'", nullptr);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
std::string arg0;
std::string arg1; ok &= luaval_to_std_string(tolua_S, ,&arg0, "ccui.ImageView:loadTextureFromURL");
ok &= luaval_to_std_string(tolua_S, ,&arg1, "ccui.ImageView:loadTextureFromURL");
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'", nullptr);
return ;
}
cobj->loadTextureFromURL(arg0.c_str(),arg1.c_str());
lua_settop(tolua_S, );
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.ImageView:loadTextureFromURL",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_ui_ImageView_loadTextureFromURL'.",&tolua_err);
#endif return ;
}
然后,还是在这个文件中

编译之后,在lua里面就可以正常使用了,比如
headImage:loadTextureFromURL(data.account.uuid.."",data.account.headicon);
headImage是用来显示头像的ImageView控件,可以先放一张默认头像的图片,然后异步加载真实头像,uuid是一个用户的唯一标识,headicon是头像url.
另外再说一下微信返回的头像默认大小好像是512*512的,太大了,我们只需要将url最后改成96,就可以得到96*96的头像,对于我的项目来说96刚刚好,你需要哪个尺寸,可以用那个url自己去试试。
cocos2dx lua中异步加载网络图片,可用于显示微信头像的更多相关文章
- UIImageView异步加载网络图片
在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下: 去下载https://github.com/rs/SDWebImage放进你的工程里,加入头文件# ...
- ios UIImageView异步加载网络图片
方法1:在UI线程中同步加载网络图片 UIImageView *headview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 4 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- cocos2dx 3.3 异步加载纹理
这里以3d场景加载为例,2d情况类似. 先同步加载模型数据和尺寸缩小了100倍的贴图,创建mesh.然后异步加载所有精细纹理并每加载完一个就替换一个,并进入场景. 如此做法的效果是当刚进入场景时看到的 ...
- android官方开源的高性能异步加载网络图片的Gridview例子
这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...
- Libgdx实现异步加载网络图片并保存到SD卡或者data/data目录下边
Libgdx实现异步加载网络图片并保存到SD卡或者data/data目录下边,当本地有图片的时候,直接从本地读取图片,如果本地没有图片,将从服务器异步加载图片 package com.example. ...
- listview中getview异步加载网络图片
前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点 ...
- Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络. ...
- (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明
原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管 ...
随机推荐
- vue指令v-cloak示例解析
v-cloak会隐藏未编译的 Mustache 标签,直至实例准备完毕: [v-cloak] { display: none; } <div v-cloak> {{ message }} ...
- C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 一点感想 很意外的,第一 ...
- JS数组去重的十种方法
一.前言: 我们在实际工作中,或者在面试找工作时,都会用到或者被问到一个问题,那就是"数组如何去重".是的,这个问题有很多种解决方案,看看下面的十种方式吧! 二.数组去重方式大汇总 ...
- akoj-1074-人见人爱A^B
人见人爱A^B Time Limit:1000MS Memory Limit:65536K Total Submit:91 Accepted:55 Description 求A^B的最后三位数表示的 ...
- Go的类型断言解析
经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...
- 米扑科技的开源项目:sitemap-php 自动生成网站地图
米扑科技旗下的产品,近期正在做SEO网站优化,其中子需求之一是调研实现了网站地图(sitemap.xml) 封装简化了许多功能模块,现在分享出来,源代码可在Github上下载,有简单的示例. Gith ...
- expungeStaleEntries函数解析
1 /** * Reference queue for cleared WeakEntries */ // 所有Entry在构造时都传入该queue private final ReferenceQu ...
- innerHTML innerText的使用和区别
document对象中有innerHTML.innerText这两个属性,都是获取document对象文本内容,但使用起来还是有区别的: 1) innerHTML设置或获取标签所包含的HTML+文本信 ...
- 记录一次https证书申请失败的案例
部分站点由于使用了大量的域名,会导致 auto-ssl 配置的内存不够用,导致证书申请失败.需要做以下调整 nginx.conf 中 lua_shared_dict auto_ssl 调整为 128m ...
- mysql 常用函数总结
常用处理函数: mysql_connect(server,user,pwd,newlink,clientflag) 连接服务器的函数,成功则返回MySQL标识,失败则返回FALSE mysql_sel ...