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之后 前几天的原文有一个线程管 ...
随机推荐
- 之前同事问到的一道python题目
Python面试题 之前同事问了一道Python题目如下,暂时归类为面试题 题目:把类似'123.456'的字符串转换成浮点型数据 方法一: >>> print '{:.3f}'.f ...
- git入门(3)git checkout 和git branch分支的创建和删除
在一个项目中,需要多人同时开发,协同coding 要求: 开发时请用开发分支daily/0.0.1, 禁止直接使用master分支开发新建分支 git checkout -b daily/0.0.1 ...
- C++标准库string
C++标准库string 定义和初始化 string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本 string s2 = s1 等价于s2(s1),s2是s1的副本 ...
- java亦或(^)
在java程序里面的异或用法: 相同输出0,不同输出1,例如: System.out.println(1^1); 输出0 System.out.println(1^2):输出3,因为最后2个低位都不一 ...
- Spring框架集成mybatis框架的配置(笔记)
<!-- 0.注解扫描 --><!-- 1.导入外部文件 --><!-- 2.数据源 --><!-- 3.session Factory -->< ...
- MyEclipse Web 项目导入 Eclipse 中需要改的文件
来自为知笔记(Wiz)
- Hello world! My first blog!
Hello world! My first blog!
- cornerstone 使用报错 working copy ... is too old(format 10 created by subversion 1.6)
1.....本来正常使用的cornerstone 突然出现这个问题 图片如下 2....解决方案,,,,也搜集了方法,,但是最后竟然就这样解决了,,完全搞不懂的解决方案啊 如图 3......如有错误 ...
- python===基础,修改idle的输入风格
http://blog.csdn.net/aq_cainiao_aq/article/details/51701861
- 版本管理工具Git(2)git的安装及使用
下载安装git 官方下载地址:https://git-scm.com/download/win 这里以windows为例,选择正确的版本: 验证是否安装成功,右键菜单中会出现如下菜单: Git工作流程 ...