可以显示在线图片的CCSprite,使用HttpClient异步请求图片数据,当请求成功时,保存图片数据到本地,然后更新CCSprite的纹理,下载中时显示默认图片(可以设置默认图片)。
OnlineImageSprite.h
#ifndef __ONLINEIMAGESPRITE_H__ #define __ONLINEIMAGESPRITE_H__ #include "cocos2d.h" USING_NS_CC; #include "cocos-ext.h" USING_NS_CC_EXT; // 可以显示在线图片的CCSprite class OnlineImageSprite:public CCSprite{ public: /* 创建一个显示在线图片的Sprite * defaultImagePath 默认图片路径(当图片加载中时显示) * url 图片url */ static OnlineImageSprite* create(const char* defaultImagePath,const char* url); bool init(const char* defaultImagePath,const char* url); void onDownloadCompleted(CCHttpClient *sender,CCHttpResponse *response); protected: // 下载图片 void downloadImage(const char* url); // 获取图片路径 std::string getImagePath(const char* url); // 图片是否存在 bool isExist(const char* url); // 保存图片 std::string saveImage(const std::string& data); private: const char* m_url; }; #endif
OnlineImageSprite.cpp
#include "OnlineImageSprite.h" #include <string> using namespace std; string& replace_all(string& str,const string& old_value,const string& new_value) { while(true) { string::size_type pos(0); if( (pos=str.find(old_value))!=string::npos ) str.replace(pos,old_value.length(),new_value); else break; } return str; } string& replace_all_distinct(string& str,const string& new_value) { for(string::size_type pos(0); pos!=string::npos; pos+=new_value.length()) { if( (pos=str.find(old_value,pos))!=string::npos ) str.replace(pos,new_value); else break; } return str; } OnlineImageSprite* OnlineImageSprite::create(const char* defaultImagePath,const char* url){ OnlineImageSprite* pSprite = new OnlineImageSprite(); if (pSprite && pSprite->init(defaultImagePath,url)) { pSprite->autorelease(); return pSprite; } CC_SAFE_DELETE(pSprite); return NULL; } bool OnlineImageSprite::init(const char* defaultImagePath,const char* url){ m_url = url; CCTexture2D* pTexture = NULL; // 图片是否存在,如果不存在使用默认纹理并下载图片 if (isExist(url)) { const char* path = getImagePath(url).c_str(); pTexture = CCTextureCache::sharedTextureCache()->addImage(path); }else{ pTexture = CCTextureCache::sharedTextureCache()->addImage(defaultImagePath); // 下载图片 downloadImage(url); } // 初始化 if (CCSprite::initWithTexture(pTexture)) { return true; } return false; } //判断图片是否已经存在 bool OnlineImageSprite::isExist(const char* url){ std::string path = getImagePath(url); return CCFileUtils::sharedFileUtils()->isFileExist(path); } //获取图片全路径 std::string OnlineImageSprite::getImagePath(const char* url){ std::string urlStr = url; replace_all(urlStr,"/",""); replace_all(urlStr,"\\",":",".",""); return CCFileUtils::sharedFileUtils()->getWritablePath().append("/").append(urlStr); } // 下载图片 void OnlineImageSprite::downloadImage(const char* url){ // 发起http请求,下载图片 CCHttpRequest* request = new CCHttpRequest(); request->setUrl(url); request->setRequestType(CCHttpRequest::kHttpGet); request->setResponseCallback(this,httpresponse_selector(OnlineImageSprite::onDownloadCompleted)); CCHttpClient::getInstance()->send(request); request->release(); } // 请求回调 void OnlineImageSprite::onDownloadCompleted(CCHttpClient *sender,CCHttpResponse *response){ if (!response) { return; } // 返回码 int statusCode = response->getResponseCode(); char statusString[64] = {}; sprintf(statusString,"HTTP Status Code: %d",statusCode); CCLog("response code: %d",statusCode); // 请求失败 if (!response->isSucceed()) { CCLog("response Failed"); CCLog("error buffer: %s",response->getErrorBuffer()); return; } // dump data std::vector<char> *buffer = response->getResponseData(); std::string data (buffer->begin(),buffer->end()); std::string path =saveImage(data); //如果保存图片成功,更新纹理 if (path != "") { CCTexture2D* pTexture = CCTextureCache::sharedTextureCache()->addImage(path.c_str()); if (pTexture) { setTexture(pTexture); } } } // 保存图片 std::string OnlineImageSprite::saveImage(const std::string& data){ std::string path = this->getImagePath(m_url); FILE* file = fopen(path.c_str(),"wb"); if (file) { // 1.buff // 2.每次写的字节数 // 3.写多少次结束 // 4.文件句柄 fwrite(data.c_str(),1,data.length(),file); fclose(file); return path; } return ""; }
使用示例:
//创建OnlineImageSpirte,参数:1.默认图片路径 2.在线图片的url CCSprite* pSprite = OnlineImageSprite::create("HelloWorld.png","http://cc.cocimg.com/cocos2dx/image/logo.png"); //设置位置 pSprite->setPosition(ccp(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y)); //添加到Layer this->addChild(pSprite,0);
项目地址:https://coding.net/u/linchaolong/p/OnlineImageSprite/git
原文链接:/cocos2dx/345446.html