zoukankan      html  css  js  c++  java
  • cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)

    #ifndef __DazzleParkour__TextLoader__

    #define __DazzleParkour__TextLoader__

    #include <stdio.h>

    #include "cocos2d.h"

    #include "network/HttpClient.h"

    #include "CCLuaValue.h"

    using namespace cocos2d::network;

    using namespace cocos2d;

    using namespace std;

    class TextLoader

    {

    public:

        static TextLoader*create(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback){

            TextLoader * instance = new TextLoader();

            instance->doHttpRequest(url,requestData,tag,textName,savePath,callback);

            return instance;

        }

        void onHttpRequestImageCompleted(HttpClient *sender, HttpResponse *response);

        void doHttpRequest(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback);

    private:

        string m_textName;

        string m_savePath;

        char m_url[500];

        LUA_FUNCTION m_callback;

    };

    #endif

    //安卓项目需要获取网络权限

    #include <stdio.h>

    #include "TextLoader.h"

    #include "ImageLoader.h"

    #include <sys/types.h>

    #include <sys/stat.h>

    #include <errno.h>

    #include <dirent.h>

    #include "CCLuaStack.h"

    #include "CCLuaEngine.h"

    #include "StringUtils.h"

    void TextLoader::onHttpRequestImageCompleted(HttpClient *sender, HttpResponse *response)

    {

        if (!response)

        {

            return;

        }

        const char* tag  =  response->getHttpRequest()->getTag();

        

        if (0 != strlen(tag))

        {

            log("%s completed", response->getHttpRequest()->getTag());

        }

        

        if (!response->isSucceed())

        {

            log("error buffer: %s", response->getErrorBuffer());

            log("error buffer: %s",this->m_url

                );

            return;

        }

     //检测当前目录下是否存在保存目录,不存在则创建

        DIR *dir = nullptr;

        dir = opendir (this->m_savePath.c_str());

        if (!dir)

        {

            vector<string> v;

            split(this->m_savePath,v,"/");

            string path = FileUtils::getInstance()->getWritablePath();

            for (size_t i = 0; i < v.size(); ++ i)

            {

                path+=v[i];

                path+="/";

                int ret = mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);

                if(ret!=0)

                {

                    log("fail to createDirectory");

                }

            }

           

        }

        string path = FileUtils::getInstance()->getWritablePath()+this->m_textName;

        FILE*file=fopen(path.c_str(),"w+");

        

        std::vector<char> *buffer = response->getResponseData();

        string data = string(buffer->begin(),buffer->end());

       

        fwrite(data.c_str(), sizeof(char), data.size(), file);

        fclose(file);

        LuaStack* pStack = LuaEngine::getInstance()->getLuaStack();//调用lua回调函数

        //第一个参数是函数的整数句柄,第二个参数是函数参数个数

        pStack->clean();

        

        pStack->executeFunctionByHandler(this->m_callback,0);

    }

    void TextLoader::doHttpRequest(const char* url,const char* requestData,const char* tag,string textName,string savePath,LUA_FUNCTION callback)

    {

        HttpRequest* request = new HttpRequest();

        request->setUrl(url);

        request->setRequestType(HttpRequest::Type::POST);

        

        //这是回调对象和回调函数

        request->setResponseCallback(CC_CALLBACK_2(TextLoader::onHttpRequestImageCompleted, this));

        request->setTag(tag);

        

        //请求的数据

        if(strlen(requestData)!=0){

            request->setRequestData(requestData,strlen(requestData));

        }

        HttpClient::getInstance()->send(request);

        this->m_textName = textName;

        this->m_savePath = savePath;

        this->m_callback = callback;

        strcpy(this->m_url, url);

        //释放内存

        request->release();

    }

    注意:在lua取栈的回调函数需要使用调用

    LUA_FUNCTION handler =  toluafix_ref_function(tolua_S,栈位置,0);

    TextLoader* ret = TextLoader::create(arg0, arg1, arg2, arg3, arg4, handler);

    自带lua打包工具会使用:

    bool ok = luaval_to_int32(tolua_S, 7,(int *)&handler, "TextLoader:create");

    笔者试过,不可行。

  • 相关阅读:
    C# 灵活切换开发/测试/生成环境web.config
    c# sqlserver 删除大批量数据超时
    vue 上传进度显示
    sqlserver the name is not a valid identifier error in function
    WEBAPI 设置上传文件大小
    vue 获取视频时长
    webapi 导入excel处理数据
    vscode 通过ftp发布vue到azure服务器
    C# 汉字转拼音
    静态代码扫描工具
  • 原文地址:https://www.cnblogs.com/HemJohn/p/4637783.html
Copyright © 2011-2022 走看看