|
配置环境与工具: 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++接口类: 于GameLuaAPI中gameluaapi.h - <font color="rgb(51, 51, 51)">#ifndef __GAMELUAAPI_H_
- #define __GAMELUAAPI_H_
- #include "cocos2d.h"
- // 以下两行注释非常重要.
- //tolua++根据这两行注释来取 C++接口
- // tolua_begin
- void API_LuaSample();
- // tolua_end
- #endif //_GAMELUAAPI_H_</font>
复制代码 于GameLuaAPI中gameluaapi.cpp
- <font color="rgb(51, 51, 51)">#include "cocos2d.h"
- #include "cocos-ext.h"
- #include "../cocos2dx_support/CCLuaEngine.h"
- USING_NS_CC;
- // 加载LUA脚本
- void API_LuaSample()
- {
- printf("API_LuaSample test c++");
- }</font>
复制代码 于GameLuaAPI文件夹中LuaRequireSample.h 这个文件是tulua++生成后的cpp文件配套的.不是必须 但是方面调用.
- <font color="rgb(51, 51, 51)">//
- // 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
- </font>
复制代码 于GamePkg中LuaMainAPI.pkg 非常简单
- <font color="rgb(51, 51, 51)">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"</font>
复制代码 配置其他文件
把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代码托管在我的githubgameluaapi.h中的两行注释// tolua_begin,// tolua_end 必须包在需要导出的C++接口函数之间,否则会无法生成响应的接口,这一点在tolua++中并没有限制,是cocos2dx加的东西.
本文来自:http://shadowkong.com/archives/1716
|