可以显示在线图片的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 "";
- }
使用示例:
项目地址:https://coding.net/u/linchaolong/p/OnlineImageSprite/git