cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用

cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用,第1张

概述cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416。    由于目前我们的项目使用的是2.x版本的,且已经开发了一半了,这时候不适合转3.x的版本,于是只能用2.x的老方法tolua++来实现绑定。这就有一个蛋疼的问题,太麻烦!每次都要写pkg、使用tolua

cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416。

   由于目前我们的项目使用的是2.x版本的,且已经开发了一半了,这时候不适合转3.x的版本,于是只能用2.x的老方法tolua++来实现绑定。这就有一个蛋疼的问题,太麻烦!每次都要写pkg、使用tolua++.exe解释器编译生成新的cpp,在其中添加自己的类的头文件引用,然后把这个新的cpp文件覆盖到liblua中以前的,再编译库,生成新的obj,才算完事。这里给出木头大神的文章,里面写的很清楚:http://blog.csdn.net/musicvs/article/details/8166572/。

   可是我不想每次都这样麻烦,我希望在自己的工程里添加绑定的接口,这样每次运行时只更新我自己的项目,就可以让lua识别我的类。初一想,那就把“LuaCocos2d.cpp”这个类放到项目中如何,这个想法完全可以的,即我们新的绑定就不再添加到“LuaCocos2d.cpp”这里了,而是单独生成一个新的、只有我们自己的的绑定类接口的一个类放到工程中。好了,废话不多说,看流程


  1】首先在我们自己的项目中创建一个文件夹,专门存放对lua的绑定接口类以及相关文件:LuaAPI@H_301_16@

  

  2】创建一个pkg文件,这个文件我们只创建一个,作为基础调用,用来给tolua++使用的,我们待会会详细说明@H_301_16@

  3】将cocos2d-x-2.2.3\tools\tolua++目录下的三个文件拷贝到1】中创建的文件里,这是工具,用来生成用的,这个不能少@H_301_16@

  

这些文件的作用,在相关绑定的文章里有详细介绍,这里稍微提一下:

basic.lua里面规定了tolua++解释器在解析pkg文件时候的附加规则

build.sh脚本命令,用来启动tolua++解释器解析pkg生成我们需要的那个cpp文件。这里需要改动,因为拷贝了一份在这个目录下,所以路径都变了,这里要注意。

#!/bin/bash## Invoked build.xml,overrIDing the lolua++ propertySCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)TolUA=`D:\cocos2d-x-2.2.3\projects\actgamelua\Classes\LuaAPI`if [ -z "${TolUA}" ]; then    TolUA=`D:\cocos2d-x-2.2.3\projects\actgamelua\Classes\LuaAPI`fiif [ -z "${TolUA}" ]; then    echo "Unable to find tolua++ (or tolua++5.1) in your PATH."    exit 1ficd ${SCRIPT_DIR}${TolUA} -L basic.lua -o "API/LuaAPI.cpp" API.pkg

这里有个"API/LuaAPI.cpp",这是我们指定的要生成的cpp文件,即生成LuaAPI.cpp放在“API/”目录下(在我们创建的LuaAPI文件夹下)

build.bat批处理程序,实际上就是执行build.sh里的设置,同样的,路径要改一下:

tolua++ -L basic.lua -o "API/LuaAPI.cpp" API.pkg

④tolua++.exe解释器,用来解析pkg生成cpp的

  4】此时,工具已备齐,命令也写好了,接下来我们要定义一个类,这个类是类似于pkg的描述文件,只不过以后我们的绑定类都按照pkg的格式写在这个里边,而不是写好多的pkg,并添加到cocos2d.pkg中。@H_301_16@

  在API目录下创建一个头文件:Pkgdiscription.h

#ifndef _TEST_PROPERTY_H__#define _TEST_PROPERTY_H__#include "cocos2d.h"USING_NS_CC;//下面"tolua_begin" and "tolua_end" 这两行注释一定不能少,因为它们是识别的开始和结束// tolua_begin //@pkg1_begin 第一个pkg描述文件开始class MyProperty : public CCObject{    MyProperty (voID);    ~MyProperty (voID);    voID setUniqueID(int ID);    int getUniqueID();    voID setRolename(const char *name);    const char* getRolename();};//@pkg1_end//@pkg2_begin//这里存放下一个自定义类的pkg描述//@pkg2_end// tolua_end#endif
那么创建这个类有什么用呢:用来给tolua++去解析编译的,而tolua++只能编译pkg,所以我们要把这个类加到API.pkg中
typedef unsigned char       BYTE;typedef int                 BOol;typedef unsigned long       DWORD;typedef unsigned short      WORD;typedef char*               LPSTR;typedef const char*         LPCSTR;$cfile "API/Pkgdiscription.h"


5】经过之前的四步,现在直接点击“build.bat”,就会根据我们写的“Pkgdiscription.h”,生成我们要的“LuaAPI.cpp”文件了,是在API/目录下@H_301_16@

  这里面有我们在Pkgdiscription.h中声明要绑定的函数接口。但是发现有错误!!

  原因是:在Pkgdiscription.h中写的自定义类MyProperty并不是我们真正的自定类,它只是一个pkg描述,那么直接的解决办法是:在LuaAPI.cpp中引入我们的头文件“MyProperty.h”

  但是这样不好,每次生成的时候都需要再次引入头文件,麻烦,但是pkg提供了生成的时候就引入头文件的办法,就是在API.pkg中添加头文件。

typedef unsigned char       BYTE;typedef int                 BOol;typedef unsigned long       DWORD;typedef unsigned short      WORD;typedef char*               LPSTR;typedef const char*         LPCSTR;$cfile "API/Pkgdiscription.h"$#include "MyProperty.h"

但是这样还不好,因为每有一个新的需要绑定的自定义类,我们都需要这API.pkg中引入,这样麻烦,那么我们就创建一个总的头文件类,专门放头文件:Pkgheadfiles.h

代码:

#ifndef __PKG_head_fileS_H_#define __PKG_head_fileS_H_#include "MyProperty.h"//在这里引入我们工程中定义的类(准备给lua用的)#endif
于是在API.pkg中
typedef unsigned char       BYTE;typedef int                 BOol;typedef unsigned long       DWORD;typedef unsigned short      WORD;typedef char*               LPSTR;typedef const char*         LPCSTR;$cfile "API/Pkgdiscription.h"$#include "Pkgheadfiles.h"
6】到这里基本已经大功告成了,但是还有一步,就是我们自己生成的LuaAPI.cpp文件,是怎么给lua使用的呢,那么只需要知道引擎本身的LuaCocos2d.cpp是怎么给lua使用的就好了。@H_301_16@

   关键点在ccluaStack中,看ccluaStack.cpp文件中init()函数,修改init()函数

bool ccluaStack::init(voID){    //....    tolua_CocoStudio_open(m_state);        //新加的一句代码    tolua_API_open(m_state);        #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)    ccluaObjcBrIDge::luaopen_luaoc(m_state);#endif    //.….    return true;}

直接添加会报错,说找不到这个函数,那么新加的tolua_API_open在哪里呢,其实是在我们生成的LuaAPI.cpp中,所以为了方便,我们写一个LuaAPI.h,里面之声明一下这个函数(单单是为了方便而已)

LuaAPI.h代码:

#ifndef __LUA_API_H_#define __LUA_API_H_#ifdef __cplusplusextern "C" {#endif#include "tolua++.h"#ifdef __cplusplus}#endifTolUA_API int tolua_API_open(lua_State* tolua_S);#endif
然后在ccluaStack中引入这个LuaAPI.h

#include "ccluaStack.h"#include "LuaAPI/API/LuaAPI.h" //这里的路径,由于我已经在liblua项目库目录中引入相关目录了,所以用的是相对路径

好了至此,我们的API目录下的文件如下:

当项目完成以后后两个头文件可以删除,现在它只是方便书写而已。

  这样,每次需要修改文件时,在“Pkgheadfiles.h”引入我们自定义的类,在“Pkgdiscription.h”中添加pkg描述,然后运行一下build.bat即可。@H_301_16@ 注意:每次生成的LuaAPI里会自动引入头文件“API/Pkgdiscription.h”,删掉它。@H_301_16@ 好了,现在绑定类都是在我们自己的工程中 *** 作的,上传svn。@H_301_16@ 总结

以上是内存溢出为你收集整理的cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用全部内容,希望文章能够帮你解决cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1034822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存