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之后 前几天的原文有一个线程管 ...
随机推荐
- OpenCV1.0在VC ++6.0下的配置
1.本人使用win7操作系统,首先要预装VC++6.0,安装方法不再赘述. 2.在OpenCV官方网站下载OpenCV的安装文件"OpenCV_1.0.EXE"(参考链接:http ...
- 经验分享:极速化 CocoaPods
Cocopods 本身是一个优秀的 iOS 开发的包管理工具,涵盖了 7k+ 的开源组件,包管理库是托管在 Github.由于众所周知的原因它的速度日渐缓慢,有时会频繁报如下错误: 1 2 3 4 $ ...
- Java Socket 编程
1. 背景 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和 ...
- mysql忘记密码,修改密码重新安装的一些问题
前言 想要装cobra,却意外发现mysql连接失败,命令行连一下发现无论怎么样都连不上了. 我能想到的密码都用上了,糟糕!看来只能修改密码,或者重装了. 最后是重装搞定的,当然也发现了正确的修改密码 ...
- MySQL中的基本知识
本文是MySQL中的一些基本知识,包括各种基本操作.数据类型和表的约束等. ps:都是自己总结.手打出来的,虽然不是什么新东西,但也勉强算原创吧.. 一.数据库 1.创建:CREATE DATABAS ...
- animate.css的使用
前面的话 animate.css是一个使用CSS3的animation制作的动画效果的CSS集合,里面预设了很多种常用的动画,且使用非常简单.本文将详细介绍animate.css的使用 引入 anim ...
- mac监听Dock激活程序
mac监听Dock激活程序 涉及库添加: LIBS += -framework CoreFoundation -framework Carbon -lobjc 涉及头文件: #include < ...
- kali linux 2.0下搭建DVWA渗透测试演练平台
DVWA (Dam Vulnerable Web Application)DVWA是用PHP+MySQL编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...
- js对敏感词的判断
先贴代码: //定义敏感字符 var forbiddenArray =['xx','<','>','黄色']; //定义函数 function forbiddenStr(str){ // ...
- 使用jquery.PrintArea.js打印网页的样式问题
在使用jquery.PrintArea.js打印局部网页样式的时候,发现样式打印不出来,在网上找了好多资料,整理一下分享给大家 一.先看看css的引用文件方式 1.直接在内部的元素中使用”style” ...