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

  

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

  

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

  

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

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

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

#!/bin/bash
#
# Invoked build.xml, overriding the lolua++ property SCRIPT_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`
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 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中。

  在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/目录下

  

  这里面有我们在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使用的就好了。

  关键点在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 __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif TOLUA_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即可。都是在我们自己的工程中操作的,上传svn。

cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用的更多相关文章

  1. win7系统cocos2dx 3.4 绑定自定义类到Lua

    Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...

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

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

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

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

  4. 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用

    步骤一:首先自定义类(这里Himi自定义类名 “MySprite”) MySprite.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // //  ...

  5. 游戏开发之coco2dx ---简化提炼tolua

    http://www.cnblogs.com/gl5773477/p/4234613.html

  6. 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua

        查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lu ...

  7. 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类

    此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...

  8. cocos2d-x_lua中tolua++绑定c++分享

    cocos2d-x_lua中tolua++绑定c++分享    我用的版本号是cocos2d-x 2.x的版本号   下面操作为了保证不更改引擎的一个类LuaCocos2d.cpp  1.操作前 能够 ...

  9. cocos2dx 2.x 版本+Windows+ADT Bundle 配置

    昨天解决了cocos2dx 3.x版本+Windows+ADT Bundle的配置,今天来解决cocos2dx 2.x版本的配置. 整体来说,2.x的配置相对麻烦一点,不过一旦解决了,就一路畅通无阻了 ...

随机推荐

  1. iOS:自动布局Autolayout

    自动布局:Autolayout 简介: 在以前的iOS程序中,是如何设置布局UI界面的? 经常编写大量的坐标计算代码 为了保证在3.5 inch和4.0 inch屏幕上都能有完美的UI界面效果,有时还 ...

  2. Linux配置自建 YUM 软件存储库

    yum软件仓库的搭建方式有三种,分别是本地yum源,网络yum源,第三方软件仓库. 以下示例演示了搭建本地yum仓库的方法: 1. 删除 /etc/yum.repos.d/dvd.repo 这个仓库文 ...

  3. mybaits3.2.8 别名包扫描通配符

    <mybatis.version>3.2.8</mybatis.version><mybatis.spring.version>1.2.2</mybatis. ...

  4. java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener ----good

    Caused by: java.lang.NoClassDefFoundError: org/springframework/context/event/GenericApplicationListe ...

  5. 人脸识别算法准确率最终超过了人类 The Face Recognition Algorithm That Finally Outperforms Humans

    Everybody has had the experience of not recognising someone they know—changes in pose, illumination ...

  6. RTC系统【转】

    http://blog.csdn.net/fanqipin/article/details/8089995 转自:http://www.cnblogs.com/muhuacat/p/5276306.h ...

  7. BZOJ 3172 单词(ac自动机)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3172 题意:给出n个单词.输出每个单词在所有单词中一共出现多少次? 思路:首先将所有单词 ...

  8. Hook入门

    Hook入门 2014-07-24 基本概念 Windows消息机制 Hook(钩子) 运行机制 核心函数 C# hook示例 基本概念[1] Windows消息机制[5] Windows操作系统是建 ...

  9. JAVA设计模式之【工厂方法模式】

    看例子 1.TV产品接口,负责播放 public interface TV // TV接口 { public void play(); } 2.TV工厂接口,负责生产产品 public interfa ...

  10. 初步窥探Git

    码农之路恒久远,学习向上是真谛啊!在学习的过程中,相信大家或多或少都接触到Git这个东东.它到底是什么呢,有什么作用呢,为什么它会那么火呢?带着这些一连串的疑问,决心去揭开它的庐山真面目. 在软件开发 ...