项目开发日志系列(二)
配置环境与工具: 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
#ifndef __GAMELUAAPI_H_ #define __GAMELUAAPI_H_ #include "cocos2d.h" // 以下两行注释非常重要. //tolua++根据这两行注释来取 C++接口 // tolua_begin void API_LuaSample(); // tolua_end #endif //_GAMELUAAPI_H_
于GameLuaAPI
中gameluaapi.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
于GamePkg
中LuaMainAPI.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加的东西.