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");
笔者试过,不可行。
cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)的更多相关文章
- cocos2dx lua 热加载实现
[Q]原创 2015-08-30 在公司使用cocos2dx+lua 开发游戏有一段时间了,刚好lua的热更新交给我负责.以前热更新的lua脚本大部分都是在下载之后加载.最近策划又有新需求,需要在游戏 ...
- XLua 网络加载(基础操作)
LoadGameMethod 网上资源加载更新:加载场景中另建协程用来加载; public void LoadGameMethod() { StartCoroutine(start()); ...
- android快捷开发之Retrofit网络加载框架的简单使用
大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目 Android-Universal-Image-Loader 或者 ignition 都是个很好的选择. 在这里把原来 ...
- ios -网络加载json和本地加载json
1网络加载json的时候,要在模型的实现文件里写: - (void)setValue:(id)value forKey:(NSString *)key { } 2本地加载json的时候,要在模型的实现 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- lua State加载部分库
lua State加载部分库 在lua中,通常我们用luaL_openlibs(L)加载所有的lub标准库,但是有时候我们想只加载部分,有没有什么好的办法呢?在luaproc看到如下办法: stati ...
- IOS空数据页面,网络加载失败以及重新登陆View的封装(不需要继承)
一.问题 对于B2C和B2B项目的开发者,可能会有一个订单列表为空,或者其他收藏页面为空,用户token失效,判断用户要重新登陆,以及后台服务错误等提示.本篇课文,看完大约10分钟. 原本自己不想写空 ...
- swift 基础小结01 --delegate、Optional、GCD的使用、request请求、网络加载图片并保存到沙箱、闭包以及桥接
本文主要记录swift中delegate的使用.“?!”Optional的概念.GCD的使用.request请求.网络加载图片并保存到沙箱.闭包以及桥接. 一.delegate的使用 swift中de ...
随机推荐
- 解决webSocke客户端连接服务端返回400错误
原因: nginx使用了转发,头信息没设置全,问题出现在nginx的配置文件 解决办法: 修改nginx.conf配置文件,在linux终端敲入vim /etc/nginx/nginx.conf,找到 ...
- Jmeter—生成excel结果文件
相信很多用jmeter进行接口测试的童鞋都会有这样的苦恼:同时执行上百条测试案例,如何能轻松加愉快地检查案例输出结果?仅仅靠jmeter的断言.debug sampler.察看结果树等是无法满足我们要 ...
- 17.视图--SQL
一.什么是视图 视图是虚拟的表 为什么使用视图 重用SQL语句. 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. 使用表的一部分而不是整个表. 保护数据.可以授予用户访 ...
- Spring boot中应用jpa jpa用法
https://blog.csdn.net/u012582402/article/details/78717705
- 牛客网Java刷题知识点之正则表达式(Matcher、Pattern)
不多说,直接上干货! 正则表达式是什么? 正则表达式是一种可以用于模式匹配和替换的规范, 一个正则表达式就是由普通的字符(例如字符a到z) 以及特殊字符(元字符) 组成的文字模式, 它用以描述在查找文 ...
- (转载)Python中模块的发布与安装
模块(Module) Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个 ...
- 疯狂使用 leancloud (投稿文章)
疯狂使用 leancloud 本文章是投稿文章,已在 leancloud 微信公众号发表. 这里是原文,内容有调整. 3年,从工程师到创始人 觉得不错可以点这里进行 leancloud 注册 项目背景 ...
- Java基础(Java概述、环境变量、注释、关键字、标识符、常量)
第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...
- vue2.0:(五)、路由vue-router
好的,接下来,我们来写路由.用的是vue2.0的路由. 步骤一:配置main.js import Vue from 'vue'; import App from './App'; import rou ...
- 一条shell统计代码行数
Xcode统计代码,用shell命令即可,非常简单.打开终端,进入你的工程目录,执行下列代码 find . -name "*.m" -or -name "*.h" ...