cocos2dx 获取网络图片并创建精灵显示到界面上


参考文章:http://blog.csdn.net/candyforever/article/details/10185855


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("https://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>   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值