cocos2dx加载网络动态图片资源

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

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

首先,头文件的设置

[cpp]   view plain  copy
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3. #include "network//HttpRequest.h"  //要引入  
  4. #include "network//HttpClient.h"   //要引入  
  5.   
  6. #include "cocos2d.h"  
  7. using namespace cocos2d::network;//使用命名空间,听同事说using namespace cocos2d::network    
  8. //和#include "network/.." 类似于java的导包  
  9. class HelloWorld : public cocos2d::Layer{  
  10. public:   
  11.     static cocos2d::Scene* createScene();   
  12.     virtual bool init();   
  13.     void onGetFinished(Node* node, void * obj);//回调函数,这里有参数Node和void Finish(void* obj);  
  14.     //对调函数,只有void 这里的Finish函数在这里只是做对比,实际是不要的。   
  15.     CREATE_FUNC(HelloWorld);  
  16. };  
  17. #endif // __HELLOWORLD_SCENE_H__  


 

.cpp文件

[cpp]   view plain  copy
  1. #include "HelloWorldScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3.   
  4. USING_NS_CC;  
  5.   
  6. Scene* HelloWorld::createScene()  
  7. {  
  8.     // 'scene' is an autorelease object  
  9.     auto scene = Scene::create();  
  10.   
  11.     // 'layer' is an autorelease object  
  12.     auto layer = HelloWorld::create();  
  13.   
  14.     // add layer as a child to scene  
  15.     scene->addChild(layer);  
  16.   
  17.     // return the scene  
  18.     return scene;  
  19. }  
  20.   
  21. // on "init" you need to initialize your instance  
  22. bool HelloWorld::init()  
  23. {  
  24.     //  
  25.     // 1. super init first  
  26.     if (!Layer::init())  
  27.     {  
  28.         return false;  
  29.     }  
  30.     auto visibleSize = Director::getInstance()->getVisibleSize();  
  31.     Vec2 origin = Director::getInstance()->getVisibleOrigin();  
  32.     std::string path = FileUtils::getInstance()->getWritablePath() + "ceshi.png";  
  33.     if (FileUtils::getInstance()->isFileExist(path)) //本地有就走本地,没有就走网络  
  34.     {  
  35.         Sprite* sprite = Sprite::create(path);  
  36.         sprite->setPosition(Vec2(50, 50));  
  37.         this->addChild(sprite);  
  38.     }  
  39.     else{  
  40.   
  41.         HttpClient* httpClient = HttpClient::getInstance();  
  42.   
  43.         HttpRequest* httprequest = new HttpRequest();  
  44.         httprequest->setRequestType(HttpRequest::Type::GET);  
  45.         httprequest->setUrl("http://avatar.csdn.net/A/6/5/1_qqxj2012.jpg");  
  46.         httprequest->setResponseCallback(this, callfuncND_selector(HelloWorld::onGetFinished));  
  47.         //httprequest->setResponseCallback(this, CC_CALLBACK_1(HelloWorld::Finish,this));这里是对比,这里不支持CC_CALLBACK此类的函数回调  
  48.         //支持类似callfuncND_selector的普通回调,callfuncND_selector    typedef void (Ref::*SEL_CallFuncND)(Node*, void*);,所以头文件的回调函数  
  49.         //是Node 和void  
  50.         httprequest->setTag("PicGet");  
  51.         httpClient->setTimeoutForConnect(30);  
  52.         httpClient->send(httprequest);  
  53.         httprequest->release();//用完之后释放  
  54.     }  
  55.     return true;  
  56. }  
  57. //对比的  
  58. void HelloWorld::Finish(void* data){  
  59.     HttpResponse* response = (HttpResponse*)data;  
  60.     if (!response){  
  61.         return;  
  62.     }  
  63.     if (!response->isSucceed()){  
  64.         CCLOG("response failed");  
  65.         CCLOG("error buffer: %s", response->getErrorBuffer());   
  66.         return;  
  67.     }  
  68.     if (0 != strlen(response->getHttpRequest()->getTag())){   
  69.         CCLOG("%s completed", response->getHttpRequest()->getTag());   
  70.     }  
  71.     std::vector<char> *buffData = response->getResponseData();   
  72.     CCImage* img = new CCImage;  
  73.     img->initWithImageData((unsigned char*)buffData->data(), buffData->size());   
  74.     CCTexture2D* texture = new CCTexture2D();   
  75.     bool isImg = texture->initWithImage(img); img->release();   
  76.     auto visibleSize = Director::getInstance()->getVisibleSize();   
  77.     Vec2 origin = Director::getInstance()->getVisibleOrigin();   
  78.     CCSprite* sprite = CCSprite::createWithTexture(texture);   
  79.     sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));  
  80.     this->addChild(sprite);  
  81.     char* buffer = (char*)malloc(buffData->size());   
  82.     std::copy(buffData->begin(), buffData->end(), buffer);   
  83.     log(StringUtils::format("路径:%s", FileUtils::getInstance()->getWritablePath().c_str()).c_str());   
  84.     auto filename = FileUtils::getInstance()->getWritablePath() + "ceshi.png";   
  85.     FILE *fp = fopen(filename.c_str(), "wb+");   
  86.     fwrite(buffer, 1, buffData->size(), fp);   
  87.     fclose(fp);  
  88. }  
  89. void HelloWorld::onGetFinished(Node* node, void* data){   
  90.     HttpResponse* response = (HttpResponse*)data;  
  91.     if (!response){   
  92.         return;  
  93.     }  
  94.     if (!response->isSucceed()){  
  95.         CCLOG("response failed");   
  96.         CCLOG("error buffer: %s", response->getErrorBuffer());   
  97.         return;   
  98.     }  
  99.     if (0 != strlen(response->getHttpRequest()->getTag())){   
  100.         CCLOG("%s completed", response->getHttpRequest()->getTag());   
  101.     }  
  102.     std::vector<char> *buffData = response->getResponseData();   
  103.     CCImage* img = new CCImage;   
  104.     img->initWithImageData((unsigned char*)buffData->data(), buffData->size());  
  105.     CCTexture2D* texture = new CCTexture2D(); bool isImg = texture->initWithImage(img);   
  106.     img->release();   
  107.     auto visibleSize = Director::getInstance()->getVisibleSize();   
  108.     Vec2 origin = Director::getInstance()->getVisibleOrigin();  
  109.     CCSprite* sprite = CCSprite::createWithTexture(texture);   
  110.     sprite->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));   
  111.     this->addChild(sprite);   
  112.     char* buffer = (char*)malloc(buffData->size());   
  113.     std::copy(buffData->begin(), buffData->end(), buffer);  
  114.     log(StringUtils::format("路径:%s", FileUtils::getInstance()->getWritablePath().c_str()).c_str());   
  115.     auto filename = FileUtils::getInstance()->getWritablePath() + "ceshi.png";   
  116.     FILE *fp = fopen(filename.c_str(), "wb+");  
  117.     fwrite(buffer, 1, buffData->size(), fp);   
  118.     fclose(fp);  
  119. }  


 
 

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

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

[java]   view plain  copy
  1. <!-- 访问internet权限 -->  
  2. <uses-permission android:name="android.permission.INTERNET"/>  
  3. <!-- 在SDCard中创建与删除文件权限 -->  
  4. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  5. <!-- 往SDCard写入数据权限 -->  
  6. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  7. <uses-permission android:name="android.permission.REORDER_TASKS"/>  
  8.   
  9. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    
  10. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>   

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos引擎加载temp图片是通过使用Sprite组件和Texture2D组件实现的。 首先,要加载temp图片,需要将图片资源添加到Cocos项目的资源文件夹中。可以将图片文件拖拽到项目的"Resources"文件夹下,或者使用代码将图片添加到资源管理器中。 接下来,我们可以在对应的场景或节点上添加一个Sprite组件。在Cocos Creator编辑器中,选中对应的节点后,在属性检查器中点击“添加组件”按钮,选择“Sprite”组件。 然后,在Sprite组件的属性检查器中,找到“spriteFrame”属性。可以通过代码或拖拽的方式,将temp图片资源赋值给“spriteFrame”。如果通过代码赋值,可以使用cc.SpriteFrame.createWithTexture2D(texture2D)来创建一个SpriteFrame,并将其赋值给“spriteFrame”。 除了Sprite组件之外,还需要使用Texture2D组件来加载temp图片。可以在代码中使用cc.loader.load加载图片资源,并通过cc.Texture2D来获取Texture2D对象。接着,将Texture2D对象传递给SpriteFrame,再将SpriteFrame赋值给Sprite组件的“spriteFrame”。 另外,当加载图片大小和显示的尺寸不一致时,可以通过Sprite组件的“sizeMode”和“type”属性来调整图片的显示方式和尺寸。 总结起来,要加载temp图片,需要通过Sprite组件和Texture2D组件来实现。首先将图片资源添加到项目的资源文件夹中,然后在对应的节点上添加Sprite组件,并将temp图片赋值给Sprite组件的“spriteFrame”。同时,使用Texture2D组件加载图片资源并将其赋值给Sprite组件的“spriteFrame”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值