cocos2dx 获取网络图片并创建精灵显示到界面上
2014-05-12 16:30
393 查看
参考文章:http://blog.csdn.net/candyforever/article/details/10185855
TestGetPicFromHttp.h
TestGetPicFromHttp.cpp
#include "TestGetPicFromHttp.h"
#include <vector>
#include <string>
using namespace std;
TestGetPicFromHttp* TestGetPicFromHttp::m_instance = 0;
TestGetPicFromHttp::TestGetPicFromHttp()
{
}
TestGetPicFromHttp::~TestGetPicFromHttp()
{
}
// on "init" you need to initialize your instance
bool TestGetPicFromHttp::init()
{
if ( !CCLayer::init() )
{
return false;
}
initHttpInfo();
return true;
}
void TestGetPicFromHttp::initHttpInfo(void)
{
CCHttpClient* httpClient = CCHttpClient::getInstance();
CCHttpRequest* httpRequest = new CCHttpRequest();
httpRequest->setRequestType(CCHttpRequest::kHttpGet);
httpRequest->setUrl("http://img.my.csdn.net/uploads/201405/12/1399882123_6429.jpg");
httpRequest->setResponseCallback(this, httpresponse_selector(TestGetPicFromHttp::onGetFinished));
httpRequest->setTag("PicGet");
httpClient->setTimeoutForConnect(30); //设置链接超时时间
httpClient->send(httpRequest);
httpRequest->release();
httpRequest = NULL;
}
void TestGetPicFromHttp::onGetFinished(CCHttpClient *client, CCHttpResponse *response)
{
// 判断是否响应成功
if (!response->isSucceed())
{
CCLog("Receive Error! %s\n",response->getErrorBuffer());
return ;
}
const char* tag = response->getHttpRequest()->getTag();
if (0 == strcmp("PicGet",tag))
{
vector<char> *data = response->getResponseData();
int data_length = data->size();
string res;
for (int i = 0;i<data_length;++i)
{
res+=(*data)[i];
}
res+='\0';
CCLog("%s",res.c_str());
}
// 数据转存
unsigned char* pBuffer = NULL;
unsigned long bufferSize = 0;
vector<char> *buffer = response->getResponseData();
string path = CCFileUtils::sharedFileUtils()->getWritablePath()+"head2.png";
pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &bufferSize);
string buff(buffer->begin(),buffer->end());
//保存到本地文件
CCLOG("path: %s",path.c_str());
FILE *fp = fopen(path.c_str(), "wb+");
fwrite(buff.c_str(), 1,buffer->size(), fp);
fclose(fp);
setGetTextureVisible();//保存完毕后 在调用显示贴图函数
}
void TestGetPicFromHttp::setGetTextureVisible(void)
{
unsigned char* pBuffer = NULL;
unsigned long bufferSize = 0;
string path = CCFileUtils::sharedFileUtils()->getWritablePath()+"head2.png";
pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &bufferSize);
if (!pBuffer)
{
return ;
}
CCImage* img = new CCImage();
img->initWithImageData(pBuffer,bufferSize);
free(pBuffer);
CCTexture2D* texture = new cocos2d::CCTexture2D();
bool isImg = texture->initWithImage(img);
img->release();
if (!isImg)
{
delete texture;
return ;
}
//这里建议使用成员变量来保存精灵,不然有可能导致显示白色块,出现异常!
CCSprite* m_get_sprite = CCSprite::createWithTexture(texture);
CCSprite* sprite = CCSprite::createWithTexture(m_get_sprite->getTexture());
if (sprite)
{
this->addChild(sprite);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
this->setPosition(ccp(winSize.width/2, winSize.height/2));
}
texture->release();
}
TestGetPicFromHttp* TestGetPicFromHttp::get_instance(void)
{
if (m_instance == NULL) {
m_instance = TestGetPicFromHttp::create();
}
return m_instance;
}
使用方式:在HelloWorldScene.cpp 中调用
![](https://img-blog.csdn.net/20140512162951703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGllZmVpZmVpMzE2OTQ4NzE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
最后说明:
1.Android 运行前,记得在AndroidManifest.xml 开启网络,读取SD卡等权限,不然不会显示!
TestGetPicFromHttp.h
#ifndef __TESTGETPICFROMHTTP_H__ #define __TESTGETPICFROMHTTP_H__ #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; class TestGetPicFromHttp : public cocos2d::CCLayer { private: TestGetPicFromHttp(); ~TestGetPicFromHttp(); public: virtual bool init(); CREATE_FUNC(TestGetPicFromHttp); void initHttpInfo(void); void onGetFinished(CCHttpClient *client, CCHttpResponse *response); void setGetTextureVisible(void); static TestGetPicFromHttp* get_instance(void); private: static TestGetPicFromHttp* m_instance; }; #endif // __TESTGETPICFROMHTTP_H__
TestGetPicFromHttp.cpp
#include "TestGetPicFromHttp.h"
#include <vector>
#include <string>
using namespace std;
TestGetPicFromHttp* TestGetPicFromHttp::m_instance = 0;
TestGetPicFromHttp::TestGetPicFromHttp()
{
}
TestGetPicFromHttp::~TestGetPicFromHttp()
{
}
// on "init" you need to initialize your instance
bool TestGetPicFromHttp::init()
{
if ( !CCLayer::init() )
{
return false;
}
initHttpInfo();
return true;
}
void TestGetPicFromHttp::initHttpInfo(void)
{
CCHttpClient* httpClient = CCHttpClient::getInstance();
CCHttpRequest* httpRequest = new CCHttpRequest();
httpRequest->setRequestType(CCHttpRequest::kHttpGet);
httpRequest->setUrl("http://img.my.csdn.net/uploads/201405/12/1399882123_6429.jpg");
httpRequest->setResponseCallback(this, httpresponse_selector(TestGetPicFromHttp::onGetFinished));
httpRequest->setTag("PicGet");
httpClient->setTimeoutForConnect(30); //设置链接超时时间
httpClient->send(httpRequest);
httpRequest->release();
httpRequest = NULL;
}
void TestGetPicFromHttp::onGetFinished(CCHttpClient *client, CCHttpResponse *response)
{
// 判断是否响应成功
if (!response->isSucceed())
{
CCLog("Receive Error! %s\n",response->getErrorBuffer());
return ;
}
const char* tag = response->getHttpRequest()->getTag();
if (0 == strcmp("PicGet",tag))
{
vector<char> *data = response->getResponseData();
int data_length = data->size();
string res;
for (int i = 0;i<data_length;++i)
{
res+=(*data)[i];
}
res+='\0';
CCLog("%s",res.c_str());
}
// 数据转存
unsigned char* pBuffer = NULL;
unsigned long bufferSize = 0;
vector<char> *buffer = response->getResponseData();
string path = CCFileUtils::sharedFileUtils()->getWritablePath()+"head2.png";
pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &bufferSize);
string buff(buffer->begin(),buffer->end());
//保存到本地文件
CCLOG("path: %s",path.c_str());
FILE *fp = fopen(path.c_str(), "wb+");
fwrite(buff.c_str(), 1,buffer->size(), fp);
fclose(fp);
setGetTextureVisible();//保存完毕后 在调用显示贴图函数
}
void TestGetPicFromHttp::setGetTextureVisible(void)
{
unsigned char* pBuffer = NULL;
unsigned long bufferSize = 0;
string path = CCFileUtils::sharedFileUtils()->getWritablePath()+"head2.png";
pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &bufferSize);
if (!pBuffer)
{
return ;
}
CCImage* img = new CCImage();
img->initWithImageData(pBuffer,bufferSize);
free(pBuffer);
CCTexture2D* texture = new cocos2d::CCTexture2D();
bool isImg = texture->initWithImage(img);
img->release();
if (!isImg)
{
delete texture;
return ;
}
//这里建议使用成员变量来保存精灵,不然有可能导致显示白色块,出现异常!
CCSprite* m_get_sprite = CCSprite::createWithTexture(texture);
CCSprite* sprite = CCSprite::createWithTexture(m_get_sprite->getTexture());
if (sprite)
{
this->addChild(sprite);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
this->setPosition(ccp(winSize.width/2, winSize.height/2));
}
texture->release();
}
TestGetPicFromHttp* TestGetPicFromHttp::get_instance(void)
{
if (m_instance == NULL) {
m_instance = TestGetPicFromHttp::create();
}
return m_instance;
}
使用方式:在HelloWorldScene.cpp 中调用
TestGetPicFromHttp* httpLayer = TestGetPicFromHttp::get_instance(); this->addChild(httpLayer); httpLayer->init();
最后说明:
1.Android 运行前,记得在AndroidManifest.xml 开启网络,读取SD卡等权限,不然不会显示!
<!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.REORDER_TASKS"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
相关文章推荐
- cocos2dx创建精灵的五种方法(包括使用图片名获取图片)
- 获取网络上的图片,并显示在界面上的简单实现
- cocos2dx创建精灵的五种方法(包括使用图片名获取图片)
- cocos2dx创建精灵的五种方法(包括使用图片名获取图片)
- Cocos2dx-获取网络图片并显示
- cocos2dx读取网络资源(图片)创建精灵代码分享
- C#中PictureBox控件获取网络图片并显示出来
- 网络通信之网络图片获取 并显示屏幕上
- 通过网络获取图片,最终转码出来的图片显示不全
- Android实现从网络获取图片显示并保存到SD卡的方法
- cocos2dx加载网络图片&图片流加载显示
- ListView的常见优化:获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式
- Android ListView从网络获取图片及文字显示
- (原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)
- android从网络获取图片并显示
- 从网络获取图片并保存到手机相册,保存成功但是相册不显示图片问题
- Android ListView从网络获取图片及文字显示
- Android ListView从网络获取图片及文字显示
- C#获取网络图片显示到picturebox
- android从相册中获取图片并将其显示在当前界面