利用CCHttpRequest获取网上http地址的图片并缓存到本地生成CCSprite用于显示

  1. //图片结构
    class imgstruct : public CCObject
  2. {
  3. public:
  4. imgstruct(const char* iName, const char* idStr, CCLayer* _layer, bool mask)
  5. {
  6. imageName = string(iName);
  7. observerId = string(idStr);
  8. layer = _layer;
  9. useMask = mask;
  10. }
  11. ~imgstruct()
  12. {
  13. }
  14.  
  15. string imageName;
  16. string observerId;
  17. CCLayer* layer; //父layer
  18. bool useMask;
  19. };

  20. //图片监听,下载完成触发
  21. class CCImageNotificationCenter : public CCNotificationCenter
  22. {
  23. public:
  24. DECLARE_SINGLETON_CLASS(CCImageNotificationCenter);
  25. CCImageNotificationCenter();
  26. ~CCImageNotificationCenter();
  27.  
  28. CCString addObserver(const char *imageName,CCLayer* layer,bool useMask);
  29. void imageLoaded();
  30. void removeObserver(const char *name);
  31.  
  32. void postNotification(const char *name, CCObject *object);
  33.  
  34. void imageLoaded(CCObject *obj);
  35. static CCSprite* getSpriteFromWriteablePath(const char* name);
  36.  
  37. private:
  38. CCNotificationCenter m_notificationCenter;
  39. int m_observerID;
  40. };

具体实现

  1. CCString CCImageNotificationCenter::addObserver(const char *imageName, CCLayer* layer, bool useMask)
  2. {
  3. CCString* observerIDstr = CCString::createWithFormat("%d",m_observerID);
  4.  
  5. m_notificationCenter.addObserver(this, callfuncO_selector(CCImageNotificationCenter::imageLoaded), observerIDstr->getCString(), new imgstruct(imageName, observerIDstr->getCString(), layer, useMask));
  6.  
  7. m_observerID++;
  8. return observerIDstr->getCString();
  9. }
  10.  
  11. void CCImageNotificationCenter::removeObserver(const char *name)
  12. {
  13. m_notificationCenter.removeObserver(this, name);
  14. }
  15.  
  16. void CCImageNotificationCenter::postNotification(const char *name, CCObject *object)
  17. {
  18. m_notificationCenter.postNotification(name, object);
  19. }
  20.  
  21. void CCImageNotificationCenter::imageLoaded(CCObject *obj)
  22. {
  23. imgstruct* img = (imgstruct*)obj;
  24. CCLOG("imageLoaded success,imageName:%s",img->imageName.c_str());
  25. CCSprite* sprite = CCImageNotificationCenter::getSpriteFromWriteablePath(img->imageName.c_str());
  26. CCLOG("got sprite 0x%X", sprite);
  27. if (img->useMask)
  28. {
  29. img->layer->addChild(CCImageNotificationCenter::createMaskedSprite(sprite,"mask.png"));
  30. }
  31. else
  32. {
  33. float scale_ = (float) img->layer->getContentSize().width / (float)sprite->getContentSize().width;
  34. sprite->setAnchorPoint(ccp(,));
  35. sprite->setScale( scale_ );
  36. img->layer->addChild(sprite);
  37. }
  38. this->removeObserver(img->observerId.c_str());
  39. img->release();
  40. }
  41.  
  42. CCSprite* CCImageNotificationCenter::getSpriteFromWriteablePath(const char* name)
  43. {
  44. std::string path = CCFileUtils::sharedFileUtils()->getWriteablePath();
  45. path += name;
  46. FILE* fp = fopen(path.c_str(),"rb");
  47. if (!fp)
  48. {
  49. return NULL;
  50. }
  51. fseek(fp,,SEEK_END);
  52. int len = ftell(fp);
  53. fseek(fp,,SEEK_SET);
  54. char* buf = (char*)malloc(len);
  55. fread(buf,len,,fp);
  56. fclose(fp);
  57. CCImage* img = new CCImage;
  58. img->initWithImageData(buf,len);
  59. free(buf);
  60. cocos2d::CCTexture2D* texture = new cocos2d::CCTexture2D();
  61. bool isImg = texture->initWithImage(img);
  62. img->release();
  63. if (!isImg)
  64. {
  65. delete texture;
  66. return CCSprite::create("default.png");//加载资源并非图片时返回的默认图
  67. }
  68. CCSprite* sprite = CCSprite::createWithTexture(texture);
  69. texture->release();
  70. return sprite;
  71. }

实现ImageDownload类

  1. class ImageDownloader : public cocos2d::CCObject
  2. {
  3. DECLARE_SINGLETON_CLASS(ImageDownloader);
  4. public:
  5. ImageDownloader();
  6. ~ImageDownloader();
  7.  
  8. void CreateLuaFunc();
  9.  
  10. void SendHttpRequest(const char* url, CCLayer* layer, const char* filename);
  11. void HttpRequestComplete(CCHttpClient *sender, CCHttpResponse *response);
  12.  
  13. CCString observerID;
  14. CCLayer* container;
  15. bool useMask;
  16. };
  1. void ImageDownloader::SendHttpRequest(const char* url, CCLayer* layer, const char* filename)
  2. {
  3. CCHttpRequest* request = new CCHttpRequest();
  4. this->container = layer;
  5. if (this->container)
  6. {
  7. CCImageNotificationCenter::CreateInstance();
  8. this->observerID = CCImageNotificationCenter::GetInstance()->addObserver(filename,container,useMask);
  9. }
  10. request->setUrl(url);
  11. // request->setUrl("http://neoimaging.beareyes.com.cn/png2/ni_png_2_1518.png");
  12. request->setRequestType(CCHttpRequest::kHttpGet);
  13. request->setResponseCallback(this, httpresponse_selector(ImageDownloader::HttpRequestComplete));
  14. request->setTag("GET IMAGE");
  15. CCHttpClient::getInstance()->send(request);
  16. request->release();
  17. }
  18.  
  19. void ImageDownloader::HttpRequestComplete(CCHttpClient *sender, CCHttpResponse *response)
  20. {
  21. if (!response)
  22. {
  23. return;
  24. }
  25.  
  26. // You can get original request type from: response->request->reqType
  27. if ( != strlen(response->getHttpRequest()->getTag()))
  28. {
  29. CCLog("%s completed", response->getHttpRequest()->getTag());
  30. }
  31.  
  32. int statusCode = response->getResponseCode();
  33. char statusString[] = {};
  34. sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
  35. CCLog("response code: %d", statusCode);
  36.  
  37. if (!response->isSucceed())
  38. {
  39. CCLog("response failed");
  40. CCLog("error buffer: %s", response->getErrorBuffer());
  41. return;
  42. }
  43.  
  44. // dump data
  45. std::vector<char> *buffer = response->getResponseData();
  46. std::string path = CCFileUtils::sharedFileUtils()->getWriteablePath();
  47. std::string bufffff(buffer->begin(),buffer->end());
  48.  
  49. //保存到本地文件
  50. path += "dl.png";
  51. CCLOG("path: %s",path.c_str());
  52. FILE *fp = fopen(path.c_str(), "wb+");
  53. fwrite(bufffff.c_str(), ,buffer->size(), fp);
  54. fclose(fp);
  55.  
  56. //传入container的下载请求会添加侦听,待下载完毕自动添加到container上
  57. if (this->container)
  58. {
  59. // container 是一个CCLayer ,用来显示动态加载的资源
  60. CCImageNotificationCenter::GetInstance()->cocos2d::CCNotificationCenter::postNotification(this->observerID.getCString());
  61. }
  62. }

Cocos2d-x利用CCHttpRequest获取网络图片并显示的更多相关文章

  1. cocos2d-x CCHttpRequest获取网络图片并显示

    转自:http://www.cnblogs.com/hzj730/p/3178431.html //图片结构 class imgstruct : public CCObject { public: i ...

  2. 获取网络图片并显示在picturbox上,byte[]数组转换成Image:

    private void getWebPicture_Click(object sender, EventArgs e) { WebRequest request = WebRequest.Creat ...

  3. 【cocos2d-x 手游研发小技巧(5)获取网络图片缓存并展示】

    今天是年前最后一天上班了,最后一天上班,祝大家马上有各种东西,最后一天也给写一点干货,就是获取网络图片: 经过自己简单封装了一下,实现了获取网络图片,按照比例展示出来,实现方法是cocos2dx - ...

  4. cocos2d-x C++ 获取网络图片缓存并展示

    #ifndef __HttpGetImg__ #define __HttpGetImg__ #include "cocos2d.h" #include "HttpRequ ...

  5. tableView 获取网络图片,并且设置为圆角(优化,fps)

    代码地址如下:http://www.demodashi.com/demo/11088.html 一.准备工作 例子比较精简,没有什么特殊要求,具备Xocde8.0左右版本的就好 二.程序实现 1.相关 ...

  6. 利用LruCache载入网络图片实现图片瀑布流效果(改进版)

    PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...

  7. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录

    最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...

  9. 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据

    利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...

随机推荐

  1. arcengine9.3与10开发授权代码

    arcgis10: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); arcgis9.3: 在窗体上放 ...

  2. 搭建Eclipse、Resin Web开发环境

    搭建Eclipse.Resin Web开发环境 一.当然是安装java开发环境 参看: Java环境的搭建 http://www.cnblogs.com/ghj1976/archive/2010/04 ...

  3. (转)Visual Studio原生开发的10个调试技巧(二)

    我以前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS200 ...

  4. list 容器 排序函数.xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

  5. 使用Python拼接多张图片

    写机器学习相关博文,经常会碰到很多公式,而Latex正式编辑公式的利器.目前国内常用的博客系统,好像只有博客园支持,所以当初选择落户博客园.我现在基本都是用Latex写博文,然后要发表到博客园上与大家 ...

  6. sendip简单使用

    sendip是linux下一个比较好用的发包软件,简单记录一下它的用法 下载源码,编译安装后,可通过  man sendip,查看具体选项介绍,其中说明sendip支持的协议包括:ipv4 ipv6 ...

  7. Netmask v. Address Prefix Length

    Netmask Address Prefix Length Hosts / Class C's / Class B's / Class A's (Class C) / / , / , / , / , ...

  8. Mapreduce读取Hbase表,写数据到多个Hbase表中

    Job端的变化: 通过设置conf,配置输出表,在reduce中获取输出表名字 Configuration conf = job.getConfiguration(); //输出表1 conf.set ...

  9. JAVA逻辑字符串判断真假

    package com.chinahrt.zyn.iteye; import javax.script.Bindings; import javax.script.Compilable; import ...

  10. 通过AopTestUtils对切面对象进行mock

    概述   当对一个切面类进行测试时,由于Spring对切面对象生成了proxy对象,此时对切面对象使用ReflectionTestUtils赋值,操作的是proxy对象,而不是真实对象,会使得赋值出问 ...