cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用
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中使用的更多相关文章
- win7系统cocos2dx 3.4 绑定自定义类到Lua
Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...
- cocos2dx lua 绑定之二:手动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...
- cocos2dx lua 绑定之一:自动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...
- 使用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 // // ...
- 游戏开发之coco2dx ---简化提炼tolua
http://www.cnblogs.com/gl5773477/p/4234613.html
- 【Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之三】动手绑定自己定义类至Lua
查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lu ...
- 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...
- cocos2d-x_lua中tolua++绑定c++分享
cocos2d-x_lua中tolua++绑定c++分享 我用的版本号是cocos2d-x 2.x的版本号 下面操作为了保证不更改引擎的一个类LuaCocos2d.cpp 1.操作前 能够 ...
- cocos2dx 2.x 版本+Windows+ADT Bundle 配置
昨天解决了cocos2dx 3.x版本+Windows+ADT Bundle的配置,今天来解决cocos2dx 2.x版本的配置. 整体来说,2.x的配置相对麻烦一点,不过一旦解决了,就一路畅通无阻了 ...
随机推荐
- apache-hadoop-1.2.1、hbase、hive、mahout、nutch、solr安装教程
1 软件环境: VMware8.0 Ubuntu-12.10-desktop-i386 jdk-7u40-linux-i586.tar.gz hadoop-1.2.1.tar.gz eclipse-d ...
- babel安装
大家都知道目前ES6不是浏览器全部都是支持的,所以要通过转码器先进行转码然后再编译代码.小心在学习ES6之前先安装了babel转码器,虽然当时安装的时候困难重重,遗憾的是没有把解决方案总结一下,别人询 ...
- 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015
Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...
- Linux内核同步机制之(三):memory barrier【转】
转自:http://www.wowotech.net/kernel_synchronization/memory-barrier.html 一.前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即 ...
- linux 实时时钟(RTC)驱动【转】
转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...
- Eclipse —— java文件修改后不能及时体现
有没有遇到过这么一种情况:某一个对象某一属性,先设值为 1 .打印出来是 1.再设值为 2 .打印出来仍是 1 ? …… 原来是工具Eclipse设置的问题. 你检查一下,Eclipse 工具栏 - ...
- Form.ShowDialog和Form.DialogResult
The dialog result of a form is the value that is returned from the form when it is displayed as a mo ...
- Makefile简介
1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):in ...
- 简单了解JAVA8的新特性
JAVA8新特性会颠覆整个JAVA程序员的编程习惯 甚至如果您坚守JAVA7之前的编程习惯,今后你看比较年轻的程序员写的JAVA代码都会无法理解 所以为了保证不脱钩,我觉得有必要学习JAVA8的新特性 ...
- 嵌入式ARM系统开发基础
从.net到delplhi 从windows到Linxu 未来有多远? 如何突破自己? 什么是自己? 我从哪里来,要到哪里去? 世界是什么? 是世选择了我,还是我选择了世界? 怎么才能够完成蜕变? 去 ...