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:

1 1 $pfile "class_A.pkg"

2 2 $pfile "class_B.pkg"
View Code

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

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

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

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

  比如,class_A.pkg:

 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

 

3、lua

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

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

1 local CCObjectTypes = {

2     "class_A",

3     "class_B",

4 }
View Code

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

 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

 

4、sh

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

 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

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

/ tolua ++ lua 绑定工具
-L lua 文件( . lua
-o :生成文件( . cpp
- H :生成头文件 (.h)
最后,使用的 pkg
 
如果,脚本运行时,提示“环境里无法找到 tolua++”。可以将 ${TOLUA} 直接写成 ./tolua++
 
小结:
  为了不与cocos2d-x自带的内容发生混淆,在 你的cocos2d-x/tools/tolua++/ 路径下,新建目录“你的项目名称”,然后按上面的方法,配置好 pkg,lua,sh的内容。运行sh即可。
  下面是我改的一个脚本,tolua++运行后,会打开生成的绑定代码文件所在路径。
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
 
绑定好的cpp文件,如何在工程中使用,参考: cocos2dx-lua绑定自定义c++类(二)

你可能感兴趣的:(cocos2dx)