【Cocos2d-x Lua】http工具类封装

实现

该工具类对Cocos2d-x中的HttpClient进行了封装,使可以在Lua中实现http异步请求。

LuaHttpClient.h

#ifndef __LUAHTTPCLIENT_H__
#define __LUAHTTPCLIENT_H__

#include "cocos2d.h"
USING_NS_CC;

#include "cocos-ext.h"
USING_NS_CC_EXT;

// 参数封装类
class LuaParams{
public:

	static LuaParams* create(){
		LuaParams* params = new LuaParams(); // 参数在回调后释放
		params->setTypeName("nil");
		return params;
	};
	static LuaParams* create(const char* url,
											int func,
											const char* data,
											CCObject* obj ,
											const char* typeName = "nil"){
			LuaParams* params = new LuaParams();
			params->setData(data);
			params->setUrl(url);
			params->setFunc(func);
			params->setCCObjct(obj);
			params->setTypeName(typeName);
			return params;
	};

	void setFunc(int func_){
		func = func_;
	};
	int getFunc(){
		return func;
	};

	void setCCObjct(CCObject* obj_){
		obj = obj_;
	};
	CCObject* getCCObjct(){
		return obj;
	};

	void setTypeName(const char* typeName_){
		typeName = typeName_;
	};
	const char* getTypeName(){
		return typeName;
	};

	void setUrl(const char* url_){
		url = url_;
	};
	const char* getUrl(){
		return url;
	};

	void setData(const char* data_){
		data = data_;
	};
	const char* getData(){
		return data;
	};
private:
	/** POST请求数据 **/
	const char* data;
	/** 请求地址 **/
	const char* url;
	/** Lua回调方法 **/
	int func;
	/** 用户数据 **/
	CCObject* obj;
	/** 用户数据类型名称 **/
	const char* typeName;
};

// Lua异步http请求工具类
class LuaHttpClient:public CCObject{
public:
	// 单例
	static LuaHttpClient* getInstance();
	// 异步Get请求
	void asynGet(LuaParams* params);
	// 异步Post请求
	void asynPost(LuaParams* params);
	// 回调函数
	void callback(CCHttpClient *sender, CCHttpResponse *response);
};

#endif

LuaHttpClient.cpp

#include "LuaHttpClient.h"
#include "../cocos2dx_support/CCLuaEngine.h"

static LuaHttpClient* s_instance = NULL;

LuaHttpClient* LuaHttpClient::getInstance(){
	if (s_instance == NULL)
	{
		s_instance = new LuaHttpClient();
		s_instance->autorelease();
	}
	return s_instance;
}

void LuaHttpClient::asynGet(LuaParams* params){
	CCHttpRequest* request = new CCHttpRequest();
	request->setUrl(params->getUrl());
	request->setRequestType(CCHttpRequest::kHttpGet);
	request->setResponseCallback(this, httpresponse_selector(LuaHttpClient::callback));
	request->setUserData((void*)params);
	CCHttpClient::getInstance()->send(request);	

	if (params->getTypeName() != "nil")
	{
		params->getCCObjct()->retain(); //引用计数+1
	}
}

void LuaHttpClient::asynPost(LuaParams* params){
	CCHttpRequest* request = new CCHttpRequest();
	request->setUrl(params->getUrl());
	request->setRequestType(CCHttpRequest::kHttpPost);
	request->setResponseCallback(this, httpresponse_selector(LuaHttpClient::callback));
	request->setUserData((void*)params);
	// write the post data
	request->setRequestData(params->getData(), strlen(params->getData()));
	CCHttpClient::getInstance()->send(request);
	request->release();

	if (params->getTypeName() != "nil")
	{
		params->getCCObjct()->retain(); //引用计数+1
	}
}

void LuaHttpClient::callback(CCHttpClient *sender, CCHttpResponse *response){

	if (!response)
	{
		return;
	}

	int statusCode = response->getResponseCode();
	char statusString[64] = {};
	sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
	CCLog("response code: %d", statusCode);

	// 回调Lua函数
	LuaParams* params = (LuaParams*)response->getHttpRequest()->getUserData();

	if (!response->isSucceed())
	{
		CCLog("response failed");
		CCLog("error buffer: %s", response->getErrorBuffer());
		// 释放内存
		if (params->getTypeName() != "nil")
		{
			params->getCCObjct()->release();	//引用计数-1
		}
		delete params;
		return;
	}

	// dump data
	std::vector<char> *buffer = response->getResponseData();
	std::string data (buffer->begin(),buffer->end());  

	CCLOG("request success");

	CCLuaStack* pStack = CCLuaEngine::defaultEngine()->getLuaStack();
	pStack->pushString(data.c_str());	//把服务器回应的数据添加到函数参数1

	//if (params->getCCObjct() && params->getTypeName()) //这个判断不知道为什么有一定随机性
	if (params->getTypeName() != "nil")
	{
		// 如果传递了CCObject,把它作为第二个参数
		pStack->pushCCObject(params->getCCObjct(),params->getTypeName());
		pStack->executeFunctionByHandler(params->getFunc(),2);
		pStack->clean();
		params->getCCObjct()->release();	//引用计数-1
	}else{
		//第一个参数是函数的整数句柄,第二个参数是函数参数个数
		pStack->executeFunctionByHandler(params->getFunc(),1);
		pStack->clean();
	}
	delete params;
}

绑定到Lua

工程地址:https://coding.net/u/linchaolong/p/Cocos2d-x_LuaHttpClient/git

该工程使用cocos2d-x-2.2.6和vs2012

把工程放到引擎projects目录下即可

1.把“绑定自定义类到lua”目录下的ext文件夹放到cocos2d-x-2.2.6\scripting\lua目录下

2.其它文件放到cocos2d-x-2.2.6\tools\tolua++目录下,点击build_ext.bat生成绑定文件

3.把LuaExt.h和LuaExt.cpp放到cocos2d-x-2.2.6\scripting\lua\cocos2dx_support下

4.修改CCLuaStack.cpp,在init方法下调用tolua_Ext_open方法注册自定义C++类

#include "LuaExt.h" //包含头文件

m_state = lua_open();

luaL_openlibs(m_state);

tolua_Cocos2d_open(m_state);

tolua_Ext_open(m_state);  //注册自定义类

toluafix_open(m_state);

5.在项目中引入文件

>>点击查看【绑定C++自定义类到Lua

调用示例

在Lua中调用的示例代码

    -- 在主线程中创建一个CCLayer
    local layer2 = CCLayerColor:create(ccc4(200,0,0,200))

    -- 回调函数(参数1:服务返回的数据,参数2:用户数据(CCObject))
    local callback = function(responseData, userdata)
        cclog("lua response data : %s",responseData)
        -- 替换场景
        local scene = CCScene:create()
        scene:addChild(userdata) -- 添加主线程中创建的CCLayer到场景
        CCDirector:sharedDirector():replaceScene(scene)
    end

    -- 1.异步http get请求并,传递一个CCObject
    local params = LuaParams:create("http://www.baidu.com",callback,"",layer2,"CCLayer")
    -- 2.异步http get请求
--    local params = LuaParams:create()
--    params:setUrl("http://www.baidu.com")
--    params:setFunc(callback)
    LuaHttpClient:getInstance():asynGet(params) --发起请求
时间: 2024-10-24 19:37:27

【Cocos2d-x Lua】http工具类封装的相关文章

fastdfs-client-java工具类封装

FastDFS是通过StorageClient来执行上传操作的 通过看源码我们知道,FastDFS有两个StorageClient工具类. StorageClient的上传方法upload_file(...)返回的是字符串数组String[], 如[group1,M00/00/00/wKgAb1dBK2iANrayAA1rIuRd3Es112.jpg] StorageClient1的上传方法upload_file(...)返回的是字符串数组String, 如group1/M00/00/00/wK

utils部分--一些通用的工具类封装

1.简介 utils部分是对一些常用的工具类进行简单的封装,使用起来比较方便.这里列举常用的一些. 2.ContextUtils使用 主要封装了网络判断.一些方法解释如下: ? 1 2 3 4 5 6 7 8 //判断是否存在网络连接 public static boolean hasNetwork(Context context); //判断GPS是否打开 public static boolean isGpsEnabled(Context context); //SD卡是否可用 public

Android Sqlite 工具类封装

鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLiteDatabase 基本操作.比如:execSQL.rawQuery.insert等等 解决了数据库并发问题 先贴上封装类代码 /** * * @ClassName: DataBaseOpenHelper * @Description: 数据库工具类 * @author lhy * @date 20

微信支付(二):工具类封装

package net.xdclass.xdvideo.utils; import java.security.MessageDigest; import java.util.UUID; /** * 常用工具类的封装,md5,uuid等 */ public class CommonUtils { /** * 生成 uuid, 即用来标识一笔单,也用做 nonce_str * @return */ public static String generateUUID(){ String uuid =

静态资源上传至远程ftp服务器,ftp工具类封装

工具类,是一个单独的工程项目 提取必要信息至ftp.properties配置文件中 ftp_host=192.168.110.128 ftp_port=21 ftp_username=ftpuser ftp_password=ftpuser ftp_dir=/home/ftpuser/jd ftp_url=http://www.images.com 封装FtpUtils工具类 public class FtpUtils { private static String ftp_host = nul

突破CRUD | 万能树工具类封装

0.学完本文你或许可以收获感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始. 1.树长什么样 ?前端的树组件大多数情况下出现在后端的管理系统中,比如我们常见的菜单树.机构树.某某分类树.树表格等.大致像下方图片所展示的这样. 菜单树 机构树 org_tree.pngorg_tree.png 树表格 大致上来说,前端树的展现形式就是上面3张图所列的几种形式.而这种前端树组件的展

Android 常见工具类封装

1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 Mes

常用工具类封装

日期转换工具类 CommUtil.java [java] view plain copy package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 日期转换工具类 */ public class CommUtil { /** * 将日期格式转换成yyyy-MM-dd的字符串格式 * 返回值如:2010-10-06 * @par

AES加密解密工具类封装(AESUtil)

import org.springframework.util.Base64Utils; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Cipher; import javax.crypto.KeyGenerat