使用cocos2d-x 3.2下载图片资源小例子
cocos2d-x(ios)下载资源可以使用以下两种方式:
第一种使用libcurl下载图片
使用这种方法需要注意的是,我们需要引入libcurl.a这个库,同时配置对应的库目录和头文件目录具体方法是:
1 导入需要的.a静态数据库
静态库的位置是在
2 导入上图所对应的头文件,头文件的路径是cocos2d根目录/external/curl/include/ios/curl
导入方式在curl文件夹上右键加入新的文件,选择对应的文件夹......
3 配置头文件和库的目录
头文件目录:
库目录:
下载图片的代码:
.h文件
//
// CurlDemo.h
// LSWGameIOS
//
// Created by lsw on 14-12-16.
//
// #ifndef __LSWGameIOS__CurlDemo__
#define __LSWGameIOS__CurlDemo__ #include <stdio.h>
#include "cocos2d.h" class CurlDemo : public cocos2d::Layer {
public:
virtual bool init();
static cocos2d::Scene* createScene();
CREATE_FUNC(CurlDemo);
private:
void downLoadPic();
static size_t pWriteCallBack(void *pData, size_t n, size_t nDataSize, FILE *stream);
static int downloadeProgress(void *clienttp, double fDownLoadTotal,double fDownLoaded,double fUpTotal,double fUpLoaded);
}; #endif /* defined(__LSWGameIOS__CurlDemo__) */
.cpp文件
//
// CurlDemo.cpp
// LSWGameIOS
//
// Created by lsw on 14-12-16.
//
// #include "CurlDemo.h"
#include "curl.h" USING_NS_CC; bool CurlDemo::init() {
if (!Layer::init()) {
return false;
} CURLcode nResCode;
CURL *pCurl = curl_easy_init();
if (pCurl != nullptr) {
auto fileName = FileUtils::getInstance()->getWritablePath() +"ceshi.jpg";
FILE *pFile = fopen(fileName.c_str(), "wb+");
CCLOG("filename = %s", fileName.c_str());
curl_easy_setopt(pCurl, CURLOPT_URL, "http://ww1.sinaimg.cn/large/7f32a2c8jw1e8lyw03zpbj20c8d1ynpd.jpg");
if (pFile != nullptr) {
curl_easy_setopt(pCurl, CURLOPT_FILE, pFile); //设置文件指针
}
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, pWriteCallBack); //回调方法
curl_easy_setopt(pCurl, CURLOPT_VERBOSE, true);
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 60); //超时时间
curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, downloadeProgress);//下载进度
nResCode = curl_easy_perform(pCurl);
curl_easy_cleanup(pCurl);
fclose(pFile);
if (nResCode == CURLE_OK) {
CCLOG("download success");
} else {
CCLOG("code : %d", nResCode);
}
} return true;
} Scene *CurlDemo::createScene() {
auto scene = Scene::create();
auto layer = CurlDemo::create();
scene->addChild(layer);
return scene;
} size_t CurlDemo::pWriteCallBack(void *pData, size_t n, size_t nDataSize, FILE *stream) {
size_t nWriten = fwrite(pData, n, nDataSize, (FILE *)stream);
return nWriten;
} int CurlDemo::downloadeProgress(void *clienttp, double fDownLoadTotal, double fDownLoaded, double fUpTotal, double fUpLoaded) {
if (fDownLoaded >= 0 && fDownLoadTotal != 0) {
CCLOG(">>>>>>>%0.2f%%\n", 100 * (fDownLoaded / fDownLoadTotal));
} return 0;
}
第二种方式,使用HttpRequest中get方式下载图片
这种方式最大优点就是使用简单,使用cocos2d-x自己封装好的类和方法,设置及其简单。
.cpp文件
void HttpRequestDemo::downloadPicture() {
HttpRequest *request = new HttpRequest();
request->setRequestType(HttpRequest::Type::GET);
request->setTag("downLoad tag 1");
request->setUrl("http://img12.3lian.com/gaoqing02/06/56/13.jpg");
request->setResponseCallback(CC_CALLBACK_2(HttpRequestDemo::onDownloadComplete, this));
HttpClient::getInstance()->sendImmediate(request);
request->release();
}
void HttpRequestDemo::onDownloadComplete(HttpClient *sender, HttpResponse *response) {
if (!response) {
return;
}
if (!response->isSucceed()) {
CCLOG("error %s", response->getErrorBuffer());
return;
}
std::vector<char> *buffData = response->getResponseData();
char *buff = (char *)malloc(buffData->size());
std::copy(buffData->begin(), buffData->end(), buff);
auto fileName = FileUtils::getInstance()->getWritablePath() +"ceshi.jpg";
FILE *fp = fopen(fileName.c_str(), "wb+");
fwrite(buff, 1, buffData->size(), fp);
fclose(fp);
}
参考文章:
http://blog.csdn.net/yirancpp/article/details/19123815
http://blog.csdn.net/yirancpp/article/details/19122921
使用cocos2d-x 3.2下载图片资源小例子的更多相关文章
- 使用libcurl下载文件小例
libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP……一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要 ...
- 苹果电脑下载电影教程:如何用folx下载《小妇人》
由西尔莎罗南.艾玛沃特森等知名影星重新演绎的<小妇人>又带动了新一轮的<小妇人>热潮.这部由露易莎创作的长篇小说,曾被多次拍摄,无论是小说本身,还是其影视资源,都能让观众回味无 ...
- Runtime的几个小例子(含Demo)
一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.) 1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数); [runti ...
- c# BackGroundWorker 多线程操作的小例子
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- 一:AndEngine的小例子
首先导入架包,下载:http://download.csdn.net/detail/duancanmeng/4060082 lib文件夹中 像我们写android程序entends Activity一 ...
- spring小例子-springMVC+mybits整合的小例子
这段时间没更博,找房去了... 吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了.. 搬家太 ...
- Java处理文件小例子--获取全国所有城市的坐标
需求:前端展示数据,全国城市的坐标
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)
lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能) 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...
- 2、Lucene 最简单的使用(小例子)
在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...
随机推荐
- networking常用命令
nc -l 3000 将开一个临时的3000端口并且侦听,用于测试
- UVa 10474 Where is the Marble
题意:给出一列数,先排序,再查找学习了sort函数,lower_bound函数sort:可以给任意对象排序(包括自己定义的)(前提是定义好了‘<’运算符)lower_bound:查找大于或者等于 ...
- 连接mongo的服务提示:HTTP Status 500 - com.mongodb.MongoException$Network: can't call something
连接mongo的服务提示以下错误 原因:达到了mongodb启动时预设的最大连接数,无法创建新的连接 HTTP Status 500 - com.mongodb.MongoException$Netw ...
- linux修改文件夹及其子文件夹的权限
加入-R 参数,就可以将读写权限传递给子文件夹例如chmod -R 777 /home/mypackage那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777.777是读.写.执行 ...
- mysql免安装版安装
MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾 ...
- [反汇编练习] 160个CrackMe之024
[反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 关闭oom killer
最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有位客户抱怨 VPS 经常死机,登陆到终端看了一下,都是常见的 Out of memory 问题.这通常是因为某时刻应用程序大量请求内存导致系统 ...
- POJ 2395 Out of Hay 草荒 (MST,Kruscal,最小瓶颈树)
题意:Bessie要从牧场1到达各大牧场去,他从不关心他要走多远,他只关心他的水袋够不够水,他可以在任意牧场补给水,问他走完各大牧场,最多的一次需要多少带多少单位的水? 思路:其实就是要让所带的水尽量 ...
- 物联网操作系统HelloX V1.79发布公告
经过HelloX开发团队近半年的努力,在HelloX V1.78版本基础上,增加许多功能特性,并对V1.78版本的一些特性进行了进一步优化之后,正式形成HelloX V1.79测试版本.经相对充分的测 ...
- Heritrix源码分析(十五) 各种问题总结(转)
开博客以及建立Heritrix 群有一段时间了(这里谢谢大家的关注),这篇博客将整理这段时间所遇到的问题.同时由于自己从今年5月份开始就不怎么接触Heritrix,很多东西开始遗忘(不过里面思想没忘) ...