cocos2dx加载网络动态图片资源

对于我刚开始学cocos2dx的初学者来说,连c++都不熟悉,写起来真是蛋疼,网上的说法千奇百怪,几乎都是过时的,没办法,只有一步一步自己学习了,先写篇文章丢下丑。

在网上下载了一份帮助文档,还是有点过时的,不过不打紧,大部分还是有效的。到时我也上传一份。

首先,头文件的设置

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "network//HttpRequest.h"  //要引入
#include "network//HttpClient.h"   //要引入

#include "cocos2d.h"
using namespace cocos2d::network;//使用命名空间,听同事说using namespace cocos2d::network  
//和#include "network/.." 类似于java的导包
class HelloWorld : public cocos2d::Layer{
public: 
	static cocos2d::Scene* createScene(); 
	virtual bool init(); 
	void onGetFinished(Node* node, void * obj);//回调函数,这里有参数Node和void Finish(void* obj);
	//对调函数,只有void 这里的Finish函数在这里只是做对比,实际是不要的。 
	CREATE_FUNC(HelloWorld);
};
#endif // __HELLOWORLD_SCENE_H__


 

.cpp文件

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
	// 'scene' is an autorelease object
	auto scene = Scene::create();

	// 'layer' is an autorelease object
	auto layer = HelloWorld::create();

	// add layer as a child to scene
	scene->addChild(layer);

	// return the scene
	return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
	//
	// 1. super init first
	if (!Layer::init())
	{
		return false;
	}
	auto visibleSize = Director::getInstance()->getVisibleSize();
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	std::string path = FileUtils::getInstance()->getWritablePath() + "ceshi.png";
	if (FileUtils::getInstance()->isFileExist(path)) //本地有就走本地,没有就走网络
	{
		Sprite* sprite = Sprite::create(path);
		sprite->setPosition(Vec2(50, 50));
		this->addChild(sprite);
	}
	else{

		HttpClient* httpClient = HttpClient::getInstance();

		HttpRequest* httprequest = new HttpRequest();
		httprequest->setRequestType(HttpRequest::Type::GET);
		httprequest->setUrl("http://avatar.csdn.net/A/6/5/1_qqxj2012.jpg");
		httprequest->setResponseCallback(this, callfuncND_selector(HelloWorld::onGetFinished));
		//httprequest->setResponseCallback(this, CC_CALLBACK_1(HelloWorld::Finish,this));这里是对比,这里不支持CC_CALLBACK此类的函数回调
		//支持类似callfuncND_selector的普通回调,callfuncND_selector    typedef void (Ref::*SEL_CallFuncND)(Node*, void*);,所以头文件的回调函数
		//是Node 和void
		httprequest->setTag("PicGet");
		httpClient->setTimeoutForConnect(30);
		httpClient->send(httprequest);
		httprequest->release();//用完之后释放
	}
	return true;
}
//对比的
void HelloWorld::Finish(void* data){
	HttpResponse* response = (HttpResponse*)data;
	if (!response){
		return;
	}
	if (!response->isSucceed()){
		CCLOG("response failed");
		CCLOG("error buffer: %s", response->getErrorBuffer()); 
		return;
	}
	if (0 != strlen(response->getHttpRequest()->getTag())){ 
		CCLOG("%s completed", response->getHttpRequest()->getTag()); 
	}
	std::vector<char> *buffData = response->getResponseData(); 
	CCImage* img = new CCImage;
	img->initWithImageData((unsigned char*)buffData->data(), buffData->size()); 
	CCTexture2D* texture = new CCTexture2D(); 
	bool isImg = texture->initWithImage(img); img->release(); 
	auto visibleSize = Director::getInstance()->getVisibleSize(); 
	Vec2 origin = Director::getInstance()->getVisibleOrigin(); 
	CCSprite* sprite = CCSprite::createWithTexture(texture); 
	sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
	this->addChild(sprite);
	char* buffer = (char*)malloc(buffData->size()); 
	std::copy(buffData->begin(), buffData->end(), buffer); 
	log(StringUtils::format("路径:%s", FileUtils::getInstance()->getWritablePath().c_str()).c_str()); 
	auto filename = FileUtils::getInstance()->getWritablePath() + "ceshi.png"; 
	FILE *fp = fopen(filename.c_str(), "wb+"); 
	fwrite(buffer, 1, buffData->size(), fp); 
	fclose(fp);
}
void HelloWorld::onGetFinished(Node* node, void* data){ 
	HttpResponse* response = (HttpResponse*)data;
	if (!response){ 
		return;
	}
	if (!response->isSucceed()){
		CCLOG("response failed"); 
		CCLOG("error buffer: %s", response->getErrorBuffer()); 
		return; 
	}
	if (0 != strlen(response->getHttpRequest()->getTag())){ 
		CCLOG("%s completed", response->getHttpRequest()->getTag()); 
	}
	std::vector<char> *buffData = response->getResponseData(); 
	CCImage* img = new CCImage; 
	img->initWithImageData((unsigned char*)buffData->data(), buffData->size());
	CCTexture2D* texture = new CCTexture2D(); bool isImg = texture->initWithImage(img); 
	img->release(); 
	auto visibleSize = Director::getInstance()->getVisibleSize(); 
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	CCSprite* sprite = CCSprite::createWithTexture(texture); 
	sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); 
	this->addChild(sprite); 
	char* buffer = (char*)malloc(buffData->size()); 
	std::copy(buffData->begin(), buffData->end(), buffer);
	log(StringUtils::format("路径:%s", FileUtils::getInstance()->getWritablePath().c_str()).c_str()); 
	auto filename = FileUtils::getInstance()->getWritablePath() + "ceshi.png"; 
	FILE *fp = fopen(filename.c_str(), "wb+");
	fwrite(buffer, 1, buffData->size(), fp); 
	fclose(fp);
}


 
 

因为我已经下载了,所以显示在坐标(250,250),若是刚下载的应该是在可视区域的中间。

要在android上跑记得在清单文件加上权限

<!-- 访问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> 

哈哈,个人还是比较菜的,写的不好多见谅啊。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值