今天是年前最后一天上班了,最后一天上班,祝大家馬上有各種東西,最后一天也給寫一點干貨,就是獲取網絡圖片;
經過自己簡單封裝了一下,實現了獲取網絡圖片,按照比例展示出來,實現方法是cocos2dx - http的異步方法,相信有很多地方都會使用
到着這個需求;比如獲取玩家的頭像。
我就直接貼代碼了,只需一個類就可以搞定;
HttpGetImg.h
#ifndef __HttpGetImg__ #define __HttpGetImg__ #include "cocos2d.h" #include "HttpRequest.h" #include "HttpClient.h" USING_NS_CC_EXT; using namespace std; USING_NS_CC; class HttpGetImg : public cocos2d::CCLayer { public: HttpGetImg(); ~HttpGetImg(); //獲取網絡圖片,需要地址 static void GetHttpImg(CCObject* obj, string imgurl,int number); void onHttpRequestRptImg(cocos2d::extension::CCHttpClient *sender, cocos2d::extension::CCHttpResponse *response); //按原來默認頭像比例設置新圖片大小 static void setImgSize(int oldhead_w,int oldhead_h,CCSprite* sprite); //創建圖片覆蓋原有圖片 static void CreateImg(CCSprite* tagSprite,CCSprite* oldSprite,CCTexture2D* texture,int newTag); private: }; #endif /* HttpGetImg */
HttpGetImg.cpp
#include "HttpGetImg.h" #include "../DataModel/GlobalInfo.h" #include "../GameConfig.h" #include "../Commen/PublicDoFunc.h" HttpGetImg::HttpGetImg(void) { } void HttpGetImg::GetHttpImg(CCObject* obj, string imgurl,int number) { CCHttpRequest* request = new CCHttpRequest(); // required fields request->setUrl(imgurl.c_str()); request->setRequestType(CCHttpRequest::kHttpGet); request->setResponseCallback(obj, httpresponse_selector(HttpGetImg::onHttpRequestRptImg)); // optional fields char thisnumber[10] = ""; sprintf(thisnumber, "%d",number); request->setTag(thisnumber); CCHttpClient::getInstance()->send(request); request->release(); } void HttpGetImg::onHttpRequestRptImg(CCHttpClient *sender, CCHttpResponse *response) { char c_tag[20]= ""; sprintf(c_tag, "%s",response->getHttpRequest()->getTag()); // CCLog("%s completed", response->getHttpRequest()->getTag()); string str_tag = c_tag; if (!response) { return; } // You can get original request type from: response->request->reqType if (0 != strlen(response->getHttpRequest()->getTag())) { // CCLog("%s completed", response->getHttpRequest()->getTag()); } if (!response->isSucceed()) { CCLog("response failed"); CCLog("error buffer: %s", response->getErrorBuffer()); return; } vector<char> *buffer = response->getResponseData(); //create image CCImage* img = new CCImage; img->initWithImageData((unsigned char*)buffer->data(),buffer->size()); //create texture CCTexture2D* texture = new CCTexture2D(); bool isImg = texture->initWithImage(img); img->release();
//將texture存下來 texture //已下是自己封裝的PublicDoFunc異步調用主線程執行換圖操作的部分,可以自己去封裝 //SEL_CallFuncN pfnCallback =callfuncN_selector(View_Room::upPlayerHead); //CCNode* nd = CCNode::create(); //buffer->clear(); //nd->setTag(CCString::create(str_tag)->intValue()); //PublicDoFunc::toDoFuncN(LAYER_ROOM, pfnCallback,nd); } void HttpGetImg::setImgSize(int oldhead_w,int oldhead_h,CCSprite* sprite) { float s_X=oldhead_w/sprite->getContentSize().width; float s_Y=oldhead_h/sprite->getContentSize().height; sprite->setScaleX(s_X); sprite->setScaleY(s_Y); } void HttpGetImg::CreateImg(CCSprite* tagSprite,CCSprite* oldSprite,CCTexture2D* texture,int newTag) { int oldw =oldSprite->getContentSize().width; int oldh =oldSprite->getContentSize().height; if(texture!=NULL) { CCSprite* sprite = CCSprite::createWithTexture(texture); //按原比例設置 setImgSize(oldw,oldh,sprite); sprite->setPosition(oldSprite->getPosition()); tagSprite->addChild(sprite,1,newTag); texture->release(); } } HttpGetImg::~HttpGetImg(void) { }
代碼非常簡潔簡單,先通過:
GetHttpImg(CCObject* obj, string imgurl,int number);
獲取到texture,然后把texture存起來,在自己要展示的頁面去調用:
CreateImg(CCSprite* tagSprite,CCSprite* oldSprite,CCTexture2D* texture,int newTag)
第一個參數是要展示的父級sprite,第二個是默認頭像圖片(如果沒有下載成功網絡圖片,顯示替代圖片),第三個是緩存的texture;
效果圖:
結束,祝大家新年快樂;
ps:群號(41131516)