cocos2d-x-lua如何导出自定义类到lua脚本环境

简介:   这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理。 我们的目的是要在lua中使用我们自己定义的类,并且这个类要导出到我们自己的module,意思就是说不是追加到LuaCocos2d.cpp里面,目的是为了使我们的module和coco2d的module完全分离,这样以后更新cocos2d-x版本时,对我们的module没影响。

 

 

这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理。

我们的目的是要在lua中使用我们自己定义的类,并且这个类要导出到我们自己的module,意思就是说不是追加到LuaCocos2d.cpp里面,目的是为了使我们的module和coco2d的module完全分离,这样以后更新cocos2d-x版本时,对我们的module没影响。

 

1、先在Classes文件夹下创建一个类Test(新创建的,名字都是都是自己定,你可以随意起,下面不赘述),代码就简单点,例如

?
1
2
3
4
5
6
7
8
9
10
11
#ifndef  _TEST_H_
#define  _TEST_H_
  
class   Test
{
public :
     Test();
     ~Test();
   static  int  foo(){ return  10;}
   int  do (){ return  20;}
};

  

 2、然后在工程目录创建一个文件夹叫MyLuaModule,和Classes文件夹同级。

 

3、里面创建个文件MyLuaModule.h,把他拖进工程(add to target勾上),写下一下代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef __MY_LUA_MODULE_H_
#define __MY_LUA_MODULE_H_
 
extern  "C"  {
#include "tolua++.h"
#include "tolua_fix.h"
}
 
#include "Test.h" //你新加的类的头文件
 
TOLUA_API int  tolua_MyLuaModule_open(lua_State* tolua_S); //这个函数我们只要在这里先声明就行了,到时候有工具自动给我们生成
 
#endif // __MY_LUA_MODULE_H_

 

4、到前面创建的MyLuaModule目录下,创建一个文件叫Test.pkg(这个最好和你新加的类名字一样),写这个文件要遵循一些规则:

1) enum keeps the same//枚举不变

2) remove CC_DLL for the class defines, pay attention to multi inherites//移除掉定义的类的CC_DLL宏(我们自定义的类其实没有),注意多重继承
3) remove inline keyword for declaration and implementation//移除inline关键字,不管是声明处还是实践处
4) remove public protect and private//移除public protect and private
5) remove the decalration of class member variable//移除成员变量
6) keep static keyword//保留static关键字
7) remove memeber functions that declared as private or protected//除掉保护的和私有的成员函数

遵循以上7点原则,我们就写下这些

注意:最好就是把你这个类的头文件里的全部复制到pkg里,然后移除掉不必要的,剩下就对了

?
1
2
3
4
5
class  Test
{
   static  int  foo();
  int  do (){ return  20;}
};

  

5、到上面创建的MyLuaModule目录下,创建一个文件叫MyLuaModule.pkg,写下一下代码

?
1
2
3
$#include "MyLuaModule.h"
 
$pfile "Test.pkg"

  

这个文件其实是作为一个汇总文件,我们就拿这个去自动生成代码。
1)第一行的目的是为了下面生成cpp的时候都会包含这个头文件。
2)第二行是我们的新加的类的描述文件(以后如果有新的类Test1,那就在写个Test1.pkg,然后再把Test1.pkg加在后面)。

6、我们进入cocos2d的根目录/tools/tolua++,Mac系统解压tolua++.Mac.zip,Win系统解压tolua.rar,把解压得到的tolua++(可执行文件)拷贝到上面创建的MyLuaModule目录下
打开命令行终端,cd到MyLuaModule目录,然后敲 ./tolua++ -o MyLuaModule.cpp MyLuaModule.pkg,把输出的文件MyLuaModule.cpp文件拽进工程(add to target勾上)
注:win的command不需要加./。我看有的人这样写./tolua++ -tCocos2d -o MyLuaModule.cpp MyLuaModule.pkg,-tCocos2d这个参数我真不知道干啥的,谁要是知道,请告诉。-o MyLuaModule.cpp是输出文件名字

7、现在准备工作都做好了,如果前面没有问题的话,是能编译通过的,接下来还有一个重要的步骤,那就是把我们module注入到LuaScriptEngine里。
打开AppDeletegate.cpp,找到CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();这一行,在后面追加一行

tolua_MyLuaClass_open(pEngine->getLuaStack()->getLuaState());同时别忘了include上我们MyLuaModule.h头文件。

8、测试。新建个lua脚本,里面写

?
1
2
3
local test = Test: new ()
print( "test:do()=" ,test: do ())
print( "Test:foo()=" ,Test:foo())

  

build完运行下看output里的结果把

相关文章
|
7天前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
23 6
|
13天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
2月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
35 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
2月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
35 2
|
3月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
4月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
7月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
264 1
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
244 0
|
6月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
182 4
|
6月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
211 0