zoukankan      html  css  js  c++  java
  • 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绑定工具
    -Llua文件(.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++类(二)

    作者:dongzee
    出处:http://www.cnblogs.com/dongzee
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接
    如有问题,可以通过  dongzee1984#gmail.com  联系我,非常感谢。

  • 相关阅读:
    多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释
    多目标遗传算法 ------ NSGA-II (部分源码解析) 目标函数值计算 eval.c
    多目标遗传算法 ------ NSGA-II (部分源码解析) 二进制编码的个体解码操作 decode.c
    多目标遗传算法 ------ NSGA-II (部分源码解析) 实数、二进制编码的变异操作 mutation.c
    多目标遗传算法 ------ NSGA-II (部分源码解析) 拥挤距离计算 crowddist.c
    模式设计
    模式识别和机器学习中的概率知识
    安卓项目开发之网页电话---基于webrtc的网络电话
    安卓项目开发之新闻客户端---新闻客户端app抓取信息
    嵌入式项目开发之步进电机---基于步进电机的遥控风扇
  • 原文地址:https://www.cnblogs.com/dongzee/p/3604947.html
Copyright © 2011-2022 走看看