quick cocos2dx 3.3rc1 如何Lua调用自定义C++类(一)------ 生成桥接代码
更新:HHH   时间:2023-1-7


    虽然网上很多关于Lua调用自定义C++类的文章,但不知道为什么,一到自己去实践,总是遇见这样那样的问题,造成失败。让我都怀疑文章的正确性了。。。有些因为细节原因,而文章又没提!踩了无数的坑,昨天终于成功了,今天迫不及待写篇文章与大家分享!

    如果对lua与C++如何交互不怎么清楚的朋友,可以看下这篇文章:

    【木头Cocos2d-x 026】Lua篇(第01章):让Lua和C++牵手

 

    如果版本不是3.x的,用以前版本的可以看下这篇文章:

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

 

    这篇文章详细介绍了几种lua调用C++的方法,最终说明了cocos2dx 3.x 用bindings-generator脚本,是多么的方便,我也感同身受,因为之前还用tolua++试过调用,还是以失败告终。。。

    虽然上面那篇文章说的很详细,但是我亲身经历测试成功,还是简单说下,让大家看得简单明了!!!

    在这之前还是要说下,除了安装好Python之外,需要进行2个步骤:

    1.安装Pyymal

    http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe 

    2.下载pyCheetah,并解压到C:\Python27\Lib\site-packages

    https://raw.github.com/dumganhar/my_old_cocos2d-x_backup/download/downloads/Cheetah.zip

    还有NDK版本要r9d版本!!!!!!

 

    官方文档:如何使用 bindings-generator 自动生成 lua绑定

    以官方文档CustomClass类为例,步骤如下:

    以下说的frameworks都是项目下的frameworks,不是quick下的!!!!

    1.在frameworks/runtime-src/Classes/目录下,创建CustomClass类

    frameworks/runtime-src/Classes/CustomClass.h

// CustomClass.h
#ifndef __CUSTOM__CLASS
#define __CUSTOM__CLASS
#include "cocos2d.h"
class CustomClass : public cocos2d::Ref
{
public:
    CustomClass();
    ~CustomClass();
    bool init();
    CREATE_FUNC(CustomClass); 
    int foo(int i);
};
#endif // __CUSTOM__CLASS

    frameworks/runtime-src/Classes/CustomClass.cpp

#include "CustomClass.h"
CustomClass::CustomClass()
{
}
CustomClass::~CustomClass()
{
}
bool CustomClass::init()
{
    return true;
}
int CustomClass::foo(int i)
{
  return i + 100;
}

    2.在frameworks/cocos2d-x/tools/tolua/目录下,创建cocos2dx_custom.ini文件

[cocos2dx_custom]
prefix = cocos2dx_custom
target_namespace = cc
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include
android_flags = -D_SIZE_T_DEFINED_
clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include 
clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__
cocos_headers = -I%(cocosdir)s -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/platform/android
cocos_flags = -DANDROID
cxxgenerator_headers =
extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s
headers = %(cocosdir)s/../runtime-src/Classes/CustomClass.h
classes = CustomClass
skip =
rename_functions =
rename_classes =
remove_prefix =
classes_have_no_parents =
base_classes_to_skip =
abstract_classes =
script_control_cpp = no

     这是最简单的ini文件了,看起来很多,其实最主要的是修改以下几句,其他几乎不用改变。

[cocos2dx_custom]
prefix = cocos2dx_custom
target_namespace = cc
headers = %(cocosdir)s/../runtime-src/Classes/CustomClass.h
classes = CustomClass

     具体含义看官方文档吧,这里就不说了,这里要说的是[cocos2dx_custom],必须与文件名字一样,否则运行脚本的时候,会报错!反正最好和文件名字一样,就不用再去踩坑了!prefix这个也用文件名字吧~

    3.在frameworks/cocos2d-x/tools/tolua/目录下,修改脚本

    我把genbindings.py拷贝了一份把名字改成genbindings_custom.py,修改以下代码:

cmd_args = {'cocos2dx_custom.ini' :('cocos2dx_custom', 'lua_cocos2dx_custom_auto') }

    这样就只会编译这个一个文件,节约时间!!!

    4.在frameworks/cocos2d-x/tools/tolua/目录下,运行脚本

    在frameworks/cocos2d-x/tools/tolua/目录下运行cmd,然后输入命令 Python genbindings_custom.py

成功执行genbindings.py脚本后,会在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目录下,生成以下2个文件

    到此我们所需要的文件都齐全了!!!!!!!

    关于如何调用在下篇文章讲解!

    如有不足之处,请大家指出,一起交流成长!

返回游戏开发教程...