【Cocos2d-x】可以显示在线图片的CCSprite
来源:互联网 发布:软件instagram下载 编辑:程序博客网 时间:2024/05/16 08:27
可以显示在线图片的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;// 可以显示在线图片的CCSpriteclass 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& old_value,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,old_value.length(),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,"\\","");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 datastd::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.在线图片的urlCCSprite* 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));//添加到Layerthis->addChild(pSprite, 0);
项目地址:https://coding.net/u/linchaolong/p/OnlineImageSprite/git
1 0
- 【Cocos2d-x】可以显示在线图片的CCSprite
- cocos2d-x中CCSprite更换图片
- cocos2d-x中CCSprite更换图片
- 更换 CCSprite 显示的图片
- Cocos2d-x-->CCSprite 动画
- cocos2d-x ccsprite 详解
- cocos2d-x 中的 CCSprite
- Cocos2d-X中的CCSprite
- cocos2d-x ccsprite 使用 shader生成自己想要的颜色的图片
- cocos2d-x 2.2.2 在lua中更换CCSprite的图片
- cocos2d-x如何反白高亮CCSprite
- cocos2d-x学习:CCSprite总结
- cocos2d-X CCsprite点击问题
- [cocos2d-x] --- CCSprite类详解
- cocos2d-x学习之CCSprite
- cocos2d-x学习:CCSprite总结
- cocos2d-x学习:CCSprite总结
- cocos2d-x学习:CCSprite总结
- 【leetcode 字符串处理】Compare Version Numbers
- jQuery对象的动画处理
- Unity网格合并_材质合并(待续)
- linux编程-文件操作(4)
- 调和级数
- 【Cocos2d-x】可以显示在线图片的CCSprite
- 素数的筛选找法
- xcode开发入门印象
- Intellij Idea快捷键(mac版)
- NGUI 3.5教程(九)Scroll view - 制作【商店】和【背包】(待续)
- Cortex系列M0-4简单对比
- 动态规划—求最长字符串子序列
- linux编程-文件操作(5)
- 勾股定理