本文主要介绍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"
(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
大体一看就懂,简单翻译如下:
1 1)枚举不变 2 2)去掉类定义中的 CC_DLL ,注意多继承(?) 3 3)去掉声明和实现中的 inline 关键字 4 4)去掉public、protected、private关键字 5 5)去掉类成员变量的声明 6 6)保留static关键字 7 7)去掉限定为private或protected的方法
比如,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 };
3、lua
这个可以参考basic.lua或basic_cocostudio.lua,可以直接复制一份,改名为test_project.lua。解释一下需要关注的部分:
(1)CCObjectTypes 是一个放置要绑定的类型名称的数组
1 local CCObjectTypes = { 2 "class_A", 3 "class_B", 4 }
(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 ]])
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
简单解释各个参数的含义:
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