项目开发日志系列(二)
配置环境与工具: 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加的东西.