本文主要介绍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 $pfile "class_A.pkg"
2 $pfile "class_B.pkg"

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

     1) enum keeps the same
2) remove CC_DLL for the class defines, pay attention to multi inherites
3) remove inline keyword for declaration and implementation
4) remove public protect and private
5) remove the decalration of class member variable
6) keep static keyword
7) remove memeber functions that declared as private or protected

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

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

  比如,class_A.pkg:

 class class_A : public cocos2d::CCObject
{
/** 这是一个关于绑定c++到lua的例子1
*
*/
static std::string test1(const char *name); /** 这是一个关于绑定c++到lua的例子2
*
*/
void test2();
};

3、lua

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

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

 local CCObjectTypes = {
"class_A",
"class_B",
}

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

 replace([[#ifndef __cplusplus
#include "stdlib.h"
#endif
#include "string.h" #include "tolua++.h"]],
[[ extern "C" {
#include "tolua_fix.h"
} #include <map>
#include <string> #include "class_A.h"
#include "class_B.h"
]])

4、sh

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

 #!/bin/bash
#
# Invoked build.xml, overriding the lolua++ property SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[]}")" && pwd)
TOLUA=`which tolua++`
if [ -z "${TOLUA}" ]; then
TOLUA=`which tolua++5.1`
fi if [ -z "${TOLUA}" ]; then
echo "Unable to find tolua++ (or tolua++5.1) in your PATH."
exit 1
fi cd ${SCRIPT_DIR}
${TOLUA} -L test_project.lua -o ../../scripting/lua/cocos2dx_support/LuaTestProject.cpp -H ../../scripting/lua/cocos2dx_support/LuaTestProject.h
test_project.pkg

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

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

cocos2dx-lua绑定自定义c++类(一)的更多相关文章

  1. cocos2dx lua 绑定之二:手动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...

  2. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  3. cocos2d-x lua绑定解析

    花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...

  4. Lua调用自定义C++类

    弄了一天终于会Lua调用自定义C++类.不容易啊. 我的电脑是64位的,装了64的Python不行,装了32位的就可以了,靠!下面是报错信息 python pyyaml Cheetah全都是装32位的 ...

  5. cocos2dx-lua绑定自定义c++类(二)

    在 cocos2dx-lua绑定自定义c++类(一)中介绍了如何产生绑定文件. 现在,来看看怎么在工程里使用这个cpp文件.像普通源码文件一样,导入到工程里,看到 LuaTest.h文件里有一个函数入 ...

  6. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]

    Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...

  7. 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

    转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...

  8. cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

    第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 )) a.c 文件 #include <lua.h> #include <lualib.h> #include ...

  9. 开源基于lua gc管理c++对象的cocos2dx lua绑定方案

    cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...

随机推荐

  1. 使用GULP打包、压缩与打版本号

    这篇文章讲我整理的一种打包项目的方式,以下是我的依赖清单 "devDependencies": { "gulp": "^3.9.1", &q ...

  2. JS-string内置对象

    1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...

  3. Java_XML操作

    xml的写: code: import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuil ...

  4. MySQL慢查询(一) - 开启慢查询

    一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态slow_q ...

  5. (转)在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送

    在SAE使用Apple Push Notification Service服务开发iOS应用, 实现消息推送 From: http://saeapns.sinaapp.com/doc.html 1,在 ...

  6. [转]Android-网络通信框架Volley使用详解

    1 Volley发送get请求: public void getJson() { String url = "http://"+host+":8080/web/json. ...

  7. [AngularJS] Angular 1.5 $transclude with named slot

    In Angular 1.5, there is no link and compile. So use if you transclude, you cannot access the fifth ...

  8. Linux驱动设备中的并发控制

    一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使 ...

  9. 【iOS开发之OC和JS互调】

    1.OC中调用JS代码 公司的移动端需要加载一个现有的网页,并且要在原网页要做一些小的调整,如将网页的标题改一下加载到手机的app上,此时就可以在app的oc代码中加入JS代码来实现.如下例子,我要加 ...

  10. Selenium2学习之-环境搭建

    1.下载安装Eclipse 2.下载并配置jdk环境变量 2.1 介绍一下环境变量设置 2.1.1 点击环境变量 2.1.2 新增系统变量JAVA_HOME 变量名:JAVA_HOME 变量值:C:\ ...