zoukankan      html  css  js  c++  java
  • cocos2d-x-lua如何导出自定义类到lua脚本环境

     

     

    这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理。

    我们的目的是要在lua中使用我们自己定义的类,并且这个类要导出到我们自己的module,意思就是说不是追加到LuaCocos2d.cpp里面,目的是为了使我们的module和coco2d的module完全分离,这样以后更新cocos2d-x版本时,对我们的module没影响。

    1、先在Classes文件夹下创建一个类Test(新创建的,名字都是都是自己定,你可以随意起,下面不赘述),代码就简单点,例如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef  _TEST_H_
    #define  _TEST_H_
      
    class  Test
    {
    public:
        Test();
        ~Test();
      static int foo(){return 10;}
      int do(){return 20;}
    };

      

     2、然后在工程目录创建一个文件夹叫MyLuaModule,和Classes文件夹同级。

    3、里面创建个文件MyLuaModule.h,把他拖进工程(add to target勾上),写下一下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef __MY_LUA_MODULE_H_
    #define __MY_LUA_MODULE_H_
     
    extern "C" {
    #include "tolua++.h"
    #include "tolua_fix.h"
    }
     
    #include "Test.h" //你新加的类的头文件
     
    TOLUA_API int tolua_MyLuaModule_open(lua_State* tolua_S); //这个函数我们只要在这里先声明就行了,到时候有工具自动给我们生成
     
    #endif // __MY_LUA_MODULE_H_

    4、到前面创建的MyLuaModule目录下,创建一个文件叫Test.pkg(这个最好和你新加的类名字一样),写这个文件要遵循一些规则:

    1) enum keeps the same//枚举不变

    2) remove CC_DLL for the class defines, pay attention to multi inherites//移除掉定义的类的CC_DLL宏(我们自定义的类其实没有),注意多重继承
    3) remove inline keyword for declaration and implementation//移除inline关键字,不管是声明处还是实践处
    4) remove public protect and private//移除public protect and private
    5) remove the decalration of class member variable//移除成员变量
    6) keep static keyword//保留static关键字
    7) remove memeber functions that declared as private or protected//除掉保护的和私有的成员函数

    遵循以上7点原则,我们就写下这些

    注意:最好就是把你这个类的头文件里的全部复制到pkg里,然后移除掉不必要的,剩下就对了

    1
    2
    3
    4
    5
    class Test
    {
      static int foo();
     int do(){return 20;}
    };

      

    5、到上面创建的MyLuaModule目录下,创建一个文件叫MyLuaModule.pkg,写下一下代码

    1
    2
    3
    $#include "MyLuaModule.h"
     
    $pfile "Test.pkg"

      

    这个文件其实是作为一个汇总文件,我们就拿这个去自动生成代码。
    1)第一行的目的是为了下面生成cpp的时候都会包含这个头文件。
    2)第二行是我们的新加的类的描述文件(以后如果有新的类Test1,那就在写个Test1.pkg,然后再把Test1.pkg加在后面)。

    6、我们进入cocos2d的根目录/tools/tolua++,Mac系统解压tolua++.Mac.zip,Win系统解压tolua.rar,把解压得到的tolua++(可执行文件)拷贝到上面创建的MyLuaModule目录下
    打开命令行终端,cd到MyLuaModule目录,然后敲 ./tolua++ -o MyLuaModule.cpp MyLuaModule.pkg,把输出的文件MyLuaModule.cpp文件拽进工程(add to target勾上)
    注:win的command不需要加./。我看有的人这样写./tolua++ -tCocos2d -o MyLuaModule.cpp MyLuaModule.pkg,-tCocos2d这个参数我真不知道干啥的,谁要是知道,请告诉。-o MyLuaModule.cpp是输出文件名字

    7、现在准备工作都做好了,如果前面没有问题的话,是能编译通过的,接下来还有一个重要的步骤,那就是把我们module注入到LuaScriptEngine里。
    打开AppDeletegate.cpp,找到CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();这一行,在后面追加一行

    tolua_MyLuaClass_open(pEngine->getLuaStack()->getLuaState());同时别忘了include上我们MyLuaModule.h头文件。

    8、测试。新建个lua脚本,里面写

    1
    2
    3
    local test = Test:new()
    print("test:do()=",test:do())
    print("Test:foo()=",Test:foo())

      

    build完运行下看output里的结果把

  • 相关阅读:
    【年度回顾】2020,云开发的20个重大更新
    SQL 排序检索数据
    【JVM进阶之路】三:探究虚拟机对象
    【JVM进阶之路】二:Java内存区域
    【JVM进阶之路】一:Java虚拟机概览
    这些不可不知的JVM知识,我都用思维导图整理好了
    计算机网络的七层结构、五层结构和四层结构
    synchronized详解
    Linux内核中I2C总线及设备长啥样?
    C语言中这些预定义宏的不可不会
  • 原文地址:https://www.cnblogs.com/cappuccino/p/3311439.html
Copyright © 2011-2022 走看看