zoukankan      html  css  js  c++  java
  • 使用cocos2d-x 3.2下载图片资源小例子

    cocos2d-x(ios)下载资源可以使用以下两种方式:

    第一种使用libcurl下载图片

    使用这种方法需要注意的是,我们需要引入libcurl.a这个库,同时配置对应的库目录和头文件目录具体方法是:

    1 导入需要的.a静态数据库



    静态库的位置是在



    2 导入上图所对应的头文件,头文件的路径是cocos2d根目录/external/curl/include/ios/curl

    导入方式在curl文件夹上右键加入新的文件,选择对应的文件夹......


    3 配置头文件和库的目录

    头文件目录:



    库目录:





    下载图片的代码:

    .h文件

    //
    //  CurlDemo.h
    //  LSWGameIOS
    //
    //  Created by lsw on 14-12-16.
    //
    //
    
    #ifndef __LSWGameIOS__CurlDemo__
    #define __LSWGameIOS__CurlDemo__
    
    #include <stdio.h>
    #include "cocos2d.h"
    
    class CurlDemo : public cocos2d::Layer {
    public:
        virtual bool init();
        static cocos2d::Scene* createScene();
        CREATE_FUNC(CurlDemo);
    private:
        void downLoadPic();
        static size_t pWriteCallBack(void *pData, size_t n, size_t nDataSize, FILE *stream);
        static int downloadeProgress(void *clienttp, double fDownLoadTotal,double fDownLoaded,double fUpTotal,double fUpLoaded);
    };
    
    #endif /* defined(__LSWGameIOS__CurlDemo__) */

    .cpp文件


    //
    //  CurlDemo.cpp
    //  LSWGameIOS
    //
    //  Created by lsw on 14-12-16.
    //
    //
    
    #include "CurlDemo.h"
    #include "curl.h"
    
    USING_NS_CC;
    
    bool CurlDemo::init() {
        if (!Layer::init()) {
            return false;
        }
        
        CURLcode nResCode;
        CURL *pCurl = curl_easy_init();
        if (pCurl != nullptr) {
            auto fileName = FileUtils::getInstance()->getWritablePath() +"ceshi.jpg";
            FILE *pFile = fopen(fileName.c_str(), "wb+");
            CCLOG("filename = %s", fileName.c_str());
            curl_easy_setopt(pCurl, CURLOPT_URL, "http://ww1.sinaimg.cn/large/7f32a2c8jw1e8lyw03zpbj20c8d1ynpd.jpg");
            if (pFile != nullptr) {
                curl_easy_setopt(pCurl, CURLOPT_FILE, pFile); //设置文件指针
            }
            curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, pWriteCallBack); //回调方法
            curl_easy_setopt(pCurl, CURLOPT_VERBOSE, true);
            curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 60); //超时时间
            curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L);
            curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, downloadeProgress);//下载进度
            nResCode = curl_easy_perform(pCurl);
            curl_easy_cleanup(pCurl);
            fclose(pFile);
            if (nResCode == CURLE_OK) {
                CCLOG("download success");
            } else {
                CCLOG("code : %d", nResCode);
            }
        }
        
        return true;
    }
    
    Scene *CurlDemo::createScene() {
        auto scene = Scene::create();
        auto layer = CurlDemo::create();
        scene->addChild(layer);
        return scene;
    }
    
    
    size_t CurlDemo::pWriteCallBack(void *pData, size_t n, size_t nDataSize, FILE *stream) {
        size_t nWriten = fwrite(pData, n, nDataSize, (FILE *)stream);
        return nWriten;
    }
    
    int CurlDemo::downloadeProgress(void *clienttp, double fDownLoadTotal, double fDownLoaded, double fUpTotal, double fUpLoaded) {
        if (fDownLoaded >= 0 && fDownLoadTotal != 0) {
            CCLOG(">>>>>>>%0.2f%%
    ", 100 * (fDownLoaded / fDownLoadTotal));
        }
        
        return 0;
    }
    
    
    


    第二种方式,使用HttpRequest中get方式下载图片

    这种方式最大优点就是使用简单,使用cocos2d-x自己封装好的类和方法,设置及其简单。

    .cpp文件

    void HttpRequestDemo::downloadPicture() {
        HttpRequest *request = new HttpRequest();
        request->setRequestType(HttpRequest::Type::GET);
        request->setTag("downLoad tag 1");
        request->setUrl("http://img12.3lian.com/gaoqing02/06/56/13.jpg");
        request->setResponseCallback(CC_CALLBACK_2(HttpRequestDemo::onDownloadComplete, this));
        HttpClient::getInstance()->sendImmediate(request);
        request->release();
    }
    
    void HttpRequestDemo::onDownloadComplete(HttpClient *sender, HttpResponse *response) {
        if (!response) {
            return;
        }
        
        if (!response->isSucceed()) {
            CCLOG("error %s", response->getErrorBuffer());
            return;
        }
        
        std::vector<char> *buffData = response->getResponseData();
        char *buff = (char *)malloc(buffData->size());
        std::copy(buffData->begin(), buffData->end(), buff);
        auto fileName = FileUtils::getInstance()->getWritablePath() +"ceshi.jpg";
        FILE *fp = fopen(fileName.c_str(), "wb+");
        fwrite(buff, 1, buffData->size(), fp);
        fclose(fp);
    }




    参考文章:

    http://blog.csdn.net/yirancpp/article/details/19123815

    http://blog.csdn.net/yirancpp/article/details/19122921








  • 相关阅读:
    Javascript 返回上一页
    html中link和import方式导入CSS文件的区别
    Leecode no.76 最小覆盖子串
    Leecode no.344 反转字符串
    Leecode no.167 两数之和 II 输入有序数组
    Leecode no.567 字符串的排列
    遍历目录和文件信息
    JAVASCRIPT显示农历的日历
    asp.net上传图片加水印(c#)
    asp.net XML操作类
  • 原文地址:https://www.cnblogs.com/shiweihappy/p/4246398.html
Copyright © 2011-2022 走看看