cocos2dx-lua绑定自定义c++类(一)

本文主要介绍mac上,如何将自定义的c++类,绑定到lua。

1、工具先行

  找到 你的cocos2d-x/tools/tolua++,里面文件按类型大致分为:

  (1)*.pkg:用于定义要绑定的c++类,暴露哪些接口。

  (2)*.lua:用于定义生成的lua绑定文件,都使用哪些转换规则。

  (3)*.sh:使用tolua++,根据.lua中的规则,将.pkg中定义的类,输出为包含绑定接口的.cpp文件。

  (4)README文件,这个比较重要,涉及到pkg文件要使用的具体规则。

2、pkg

 (1)通常为项目定义一个总的pkg文件,里面包含项目中具体使用的class的pkg文件。即 test_project.pkg:

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
1 1 $pfile "class_A.pkg"
2 2 $pfile "class_B.pkg"
View Code
cocos2dx-lua绑定自定义c++类(一)

 (2)具体每个class文件,遵循README。看看内容:

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
1     1) enum keeps the same
2     2) remove CC_DLL for the class defines, pay attention to multi inherites
3     3) remove inline keyword for declaration and implementation
4     4) remove public protect and private
5     5) remove the decalration of class member variable
6     6) keep static keyword
7     7) remove memeber functions that declared as private or protected
View Code
cocos2dx-lua绑定自定义c++类(一)

  大体一看就懂,简单翻译如下:

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
1 1)枚举不变
2 2)去掉类定义中的 CC_DLL ,注意多继承(?)
3 3)去掉声明和实现中的 inline 关键字
4 4)去掉public、protected、private关键字
5 5)去掉类成员变量的声明
6 6)保留static关键字
7 7)去掉限定为private或protected的方法
View Code
cocos2dx-lua绑定自定义c++类(一)

  比如,class_A.pkg:

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
 1 class class_A : public cocos2d::CCObject
 2 {
 3     /** 这是一个关于绑定c++到lua的例子1
 4      *
 5      */
 6     static std::string test1(const char *name);
 7 
 8     /** 这是一个关于绑定c++到lua的例子2
 9      *
10      */
11     void test2();
12 };
View Code
cocos2dx-lua绑定自定义c++类(一)

 

3、lua

  这个可以参考basic.lua或basic_cocostudio.lua,可以直接复制一份,改名为test_project.lua。解释一下需要关注的部分:

 (1)CCObjectTypes 是一个放置要绑定的类型名称的数组 

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
1 local CCObjectTypes = {
2     "class_A",
3     "class_B",
4 }
View Code
cocos2dx-lua绑定自定义c++类(一)

 (2)下面很长一段,都是关于绑定接口文件,自动生成的规则,我们主要关注 #include 这部分即可。

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
 1 replace([[#ifndef __cplusplus
 2 #include "stdlib.h"
 3 #endif
 4 #include "string.h"
 5 
 6 #include "tolua++.h"]],
 7       [[
 8 
 9 extern "C" {
10 #include "tolua_fix.h"
11 }
12 
13 #include <map>
14 #include <string>
15 
16 #include "class_A.h"
17 #include "class_B.h"
18 ]])
View Code
cocos2dx-lua绑定自定义c++类(一)

 

4、sh

  可以直接复制一份basic.sh,然后修改对应的文件名称:.lua、.cpp、.h、.pkg

cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
 1 #!/bin/bash
 2 #
 3 # Invoked build.xml, overriding the lolua++ property
 4 
 5 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
 6 TOLUA=`which tolua++`
 7 if [ -z "${TOLUA}" ]; then
 8     TOLUA=`which tolua++5.1`
 9 fi
10 
11 if [ -z "${TOLUA}" ]; then
12     echo "Unable to find tolua++ (or tolua++5.1) in your PATH."
13     exit 1
14 fi
15 
16 cd ${SCRIPT_DIR}
17 ${TOLUA} -L test_project.lua -o ../../scripting/lua/cocos2dx_support/LuaTestProject.cpp -H ../../scripting/lua/cocos2dx_support/LuaTestProject.h 
18 test_project.pkg
View Code
cocos2dx-lua绑定自定义c++类(一)

  简单解释各个参数的含义:

?/tolua++ lua绑定工具
?-Llua文件(.lua
?-o:生成文件(.cpp
?-H:生成头文件(.h)
?最后,使用的pkg
 
如果,脚本运行时,提示“环境里无法找到 tolua++”。可以将 ${TOLUA} 直接写成 ./tolua++
 
小结:
  为了不与cocos2d-x自带的内容发生混淆,在 你的cocos2d-x/tools/tolua++/ 路径下,新建目录“你的项目名称”,然后按上面的方法,配置好 pkg,lua,sh的内容。运行sh即可。
  下面是我改的一个脚本,tolua++运行后,会打开生成的绑定代码文件所在路径。
cocos2dx-lua绑定自定义c++类(一)
cocos2dx-lua绑定自定义c++类(一)
1 #!/bin/bash
2 #
3 # Invoked build.xml, overriding the lolua++ property
4 
5 SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
6 echo ${SCRIPT_DIR}
7 cd ${SCRIPT_DIR}
8 ../tolua++ -L test.lua -o ../../../scripting/lua/cocos2dx_support/LuaTest.cpp -H ../../../scripting/lua/cocos2dx_support/LuaTest.h test.pkg
9 open ../../../scripting/lua/cocos2dx_support
View Code
cocos2dx-lua绑定自定义c++类(一)
 
绑定好的cpp文件,如何在工程中使用,参考:cocos2dx-lua绑定自定义c++类(二)

cocos2dx-lua绑定自定义c++类(一),布布扣,bubuko.com

cocos2dx-lua绑定自定义c++类(一)

上一篇:#Java编程题-百钱百鸡


下一篇:【摘录】JAVA内存管理-自动选择垃圾收集器算法