2dx给Lua增加C接口的两种方式

项目开发日志系列(二)

配置环境与工具: cocos2d-x-2.2.3,Lua5.1,tulua++,Xcode;

测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua

  • 官方接口的方式

cocos2d-x的Lua binding中给Lua增加C++接口相信很多朋友都会,谷歌上的教程全部是往/scripting/lua/cocos2dx_support 和搭配往/tools/tolua++/cocos2dx.pkg增加PKG然后重新生成 LuaCocos2d.cpp 的方式,但是这种方式不适合引擎的无缝升级,而且封闭性感觉不太好,如果能把项目的东西和引擎的东西完全脱离开 那是最好的,这样在更新 在升级版本上都非常容易,而且你看 LuaCocosd2d.cpp 都70000多行了..所以 我们应该把个人定制的C++接口完全和官方的独立开来.

  • 独立的接口增加方式

首先当然还是把接口写好.

新建文件夹:

存放C++新增的接口文件夹 – cocos2d-x-2.2.3/scripting/lua/GameLuaAPI;

用于生成Cpp文件的文件夹 – cocos2d-x-2.2.3/scripting/lua/GamePkg;

增加C++接口类:

GameLuaAPIgameluaapi.h

#ifndef __GAMELUAAPI_H_
#define __GAMELUAAPI_H_

#include "cocos2d.h"
// 以下两行注释非常重要.
//tolua++根据这两行注释来取 C++接口

// tolua_begin
void API_LuaSample();
// tolua_end

#endif //_GAMELUAAPI_H_

GameLuaAPIgameluaapi.cpp

#include "cocos2d.h"
#include "cocos-ext.h"
#include "../cocos2dx_support/CCLuaEngine.h"
USING_NS_CC;
// 加载LUA脚本
void API_LuaSample()
{
    printf("API_LuaSample test c++");
}

GameLuaAPI文件夹中LuaRequireSample.h 这个文件是tulua++生成后的cpp文件配套的.不是必须 但是方面调用.

//
//  LuaRequireSample.h
//  HelloLua
//
//  Created by rect on 14-5-6.
//
//
#ifndef HelloLua_LuaRequireSample_h
#define HelloLua_LuaRequireSample_h

#ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif
TOLUA_API int tolua_LuaMainAPI_open (lua_State* tolua_S);
#endif

GamePkgLuaMainAPI.pkg 非常简单

typedef unsigned char       BYTE;
typedef int                 BOOL;
typedef unsigned long       DWORD;
typedef unsigned short      WORD;
typedef char*               LPSTR;
typedef const char*         LPCSTR;
$cfile "../GameLuaAPI/GameLuaAPI.h"

配置其他文件

把tolua++配置到GamePkg文件夹里 部分文件在tools/tolua++中取,基本文件结构如下:

GamePkg文件夹中:basic.lua,build.sh,luamainapi.pkg,tolua++ (除了pkg文件自己编写之外,其他文件都可以去引擎文件夹tools/tolua++取)

build.sh命令修改如下:

/tolua++ -L basic.lua -o "LuaRequireSample.cpp" LuaMainAPI.pkg

这时候执行build.sh应该生成了LuaRequireSample.cpp文件

GameLuaAPI文件夹中:gameluaapi.cpp,gameluaapi.h,LuaRequireSample.h

修改CCLuaStack.cpp文件

这个文件位于cocos2d-x-2.2.3/scripting/lua/cocos2dx_support;
新引入头文件:

#include "LuaRequireSample.h"

修改函数init,其实就加一句代码

bool CCLuaStack::init(void)
{
    //....
    tolua_CocoStudio_open(m_state);
    
    //新加的一句代码
    tolua_LuaMainAPI_open(m_state);
    
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
    CCLuaObjcBridge::luaopen_luaoc(m_state);
#endif
    //.….
    return true;
}

于是我们就可以优雅的调用C++接口了.例如我们的lua文件下调用API_LuaSample函数.这个函数只打印一句话:

-- lua
-- API_LuaSample
function main(  )
    API_LuaSample()
end
main()

Sample代码托管在我的github

  • 特别注意

gameluaapi.h中的两行注释// tolua_begin,// tolua_end 必须包在需要导出的C++接口函数之间,否则会无法生成响应的接口,这一点在tolua++中并没有限制,是cocos2dx加的东西.

发表评论

邮箱地址不会被公开。 必填项已用*标注