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"

  4】经过之前的四步,现在直接点击“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"

  ⑤到这里基本已经大功告成了,但是还有一步,就是我们自己生成的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。

时间: 2024-10-20 09:43:02

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

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之二】新建项目中配制环境

查看[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之一]环境搭建,想必你的环境已经准备好了. 在<[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之一]环境搭建>中,为何最后一步是在Quick引擎中去完成绑定C++至Lua的脚本呢? 原因是引擎帮我们设置好了引擎已有类文件绑定的一系列环境,但是我们不可能在引擎的源模版中去开发我们的项目,而是通过引擎模版创建我们自已独立的新项目,而当我们创建自已的新项目时,我们知道,新的项目会从源模版引擎中,将一些可能用到的

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之三】动手绑定自定义类至Lua

查看[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完成了绑定需要的环境,接下来才是最关健的一步.绑定自定义C++类至Lua. 事实上引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的工程项目.为了编辑代码方便,我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"工程. 前往项目录径"F:\Cocos2dx-Lua\Garfield\frameworks

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之四】使用绑定C++至Lua的自定义类

续[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之三]动手绑定自定义类至Lua 之后,我们已经完成了自定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们需要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单. // Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 1. lua_pet_auto.hpp // Path : 

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之一】环境搭建

* 确定你安装了Android NDK R9B 版本 ,如果没有前往以下地址下载. ( https://dl.google.com/android/ndk/android-ndk-r9b-linux-x86_64.tar.bz2) from (http://developer.android.com/tools/sdk/ndk/index.html) * 前往 (http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi)下载Python2.7

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

cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一个用于测试手动绑定的函数manual_call ①Student.h中增加函数 //手动绑定调用函数 void manual_call(); ②Student.cpp中增加函数实现 //和自动绑定相比,只增加了这个函数 void Student::manual_call() { std::cout <&

cocos2dx lua 如何自动绑定自定义类

cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注意:这个类没有从Ref继承,是一个简单的C++类. ①头文件Student.h 1 #pragma once 2 3 #include "base/ccMacros.h" 4 #include <iostream> 5 #include <string> 6 7 /

用tolua++把c++类转LUA调用的类库经历分享

c++类转成LUA调用的类 第一步:准备需要用的c++类 例子如下: c++头文件定义 #ifndef __testlua__#define __testlua__ #include <iostream>#include <string>#include <string.h>using namespace std;class testlua{private: static std::string testluatxt ; public: static std::stri

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

查看[Quick-COCOS2D-X 3.3 怎样绑定自己定义类至Lua之二]新建项目中配制环境,我们完美的在新建项目中完毕了绑定须要的环境,接下来才是最关健的一步.绑定自己定义C++类至Lua. 其实引擎为了方便我们应对不同平台,已经帮我们创建了不同平台的project项目. 为了编辑代码方便.我使用VS2013打开了"runtime-src"文件夹下的"proj.win32"project. 前往项文件夹径"F:\Cocos2dx-Lua\Garfie

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco