Cocos2d-x 3.2 Lua调用自定义C++类
1.环境
- 系统:Windows 7 64位
- Cocos2d-x:3.2
- python:2.75 32位
- NDK:android-ndk-r9b或android-ndk-r9d,需要配置环境变量:NDK_ROOT
- pyyaml:PyYAML-3.10.win32-py2.7.exe 安装到 ..\Python27\Lib\site-packages
- pyCheetah:Cheetah.zip 解压到 ..\Python27\Lib\site-packages
2.自定义C++类
路径:我保存在..\cocos2d-x-3.2\cocos\my\
// CustomClass.h
#ifndef __CUSTOM__CLASS
#define __CUSTOM__CLASS
#include "cocos2d.h"
namespace cocos2d {
class CustomClass : public cocos2d::Ref
{
public:
CustomClass();
~CustomClass();
static cocos2d::CustomClass* create();
bool init();
CREATE_FUNC(CustomClass);
};
} //namespace cocos2d
#endif // __CUSTOM__CLASS
// CustomClass.cpp
#include "CustomClass.h"
USING_NS_CC;
CustomClass::CustomClass(){
}
CustomClass::~CustomClass(){
}
bool CustomClass::init(){
return true;
}
std::string CustomClass::helloMsg() {
return "Hello from CustomClass::sayHello";
}
3.自定义ini文件
路径:..\cocos2d-x-3.2\tools\tolua\
可复制目录下的某个ini文件作为模板,我用了:cocos2dx_spine.ini
主要需要修改以下参数配置:
- [cocos2dx_spine]
- prefix = cocos2dx_spine
- target_namespace = sp
- headers = %(cocosdir)s/cocos/editor-support/spine/spine-cocos2dx.h
- classes = Skeleton SkeletonAnimation
我这里的设置是:
- [cocos2dx_custom]
- prefix = cocos2dx_custom
- target_namespace = my
- headers = %(cocosdir)s/cocos/my/CustomClass.h
- classes = CustomClass
4.修改genbindings.py脚本
路径:..\cocos2d-x-3.2\tools\tolua\genbindings.py
找到cmd_args项,增加:
'cocos2dx_custom.ini' : ('cocos2dx_custom', 'lua_cocos2dx_custom'), \
可用#注释掉其它的ini文件引用
5.运行genbindings.py脚本
路径:..\cocos2d-x-3.2\tools\tolua\genbindings.py
在命令提示符中进入脚本所在目录,执行:
python genbindings.py
完成后可在..\cocos2d-x-3.2\cocos\scripting\lua-bindings\auto\中找到生成的文件
6.运行工程
- 用visual studio打开..\cocos2d-x-3.2\build\cocos2d-win32.vc2012.sln,设置lua-empty-test为启动项目。
- 将..\cocos2d-x-3.2\cocos\my\下的自定义类添加到项目lua-empty-test的Classes中
- 将生成的C++的桥接文件添加到项目liblua的auto下
- 对liblua项目右键,在属性 - 配置属性 - C/C++ - 常规 - 附加包含目录中加入生成文件路径..\cocos2d-x-3.2\cocos\my\
- 编辑lua-empty-test的入口类AppDelegate.cpp:
#include "cocos2d.h"
#include "AppDelegate.h"
#include "audio/include/SimpleAudioEngine.h"
#include "base/CCScriptSupport.h"
#include "CCLuaEngine.h"
USING_NS_CC;
using namespace CocosDenshion;
AppDelegate::AppDelegate()
{
// fixed me
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
}
AppDelegate::~AppDelegate()
{
// end simple audio engine here, or it may crashed on win32
SimpleAudioEngine::getInstance()->end();
//CCScriptEngineManager::destroyInstance();
}
bool AppDelegate::applicationDidFinishLaunching()
{
// register lua engine
LuaEngine* engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
//The call was commented because it will lead to ZeroBrane Studio can't find correct context when debugging
//engine->executeScriptFile("src/hello.lua");
//增加以下5句
LuaStack* stack = engine->getLuaStack();
lua_State* state = stack->getLuaState();
lua_getglobal(state, "_G");
register_all_MyClass(stack->getLuaState());
lua_pop(state, 1);
engine->executeString("require 'src/hello.lua'");
return true;
}
// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground()
{
Director::getInstance()->stopAnimation();
SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}
// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
Director::getInstance()->startAnimation();
SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
}
- 在lua中引用自定义的C++类
路径:..\cocos2d-x-3.2\tests\lua-empty-test\src\
打开hello.lua,在main方法中加入以下代码:
local test = my.CustomClass:create()
print("==================== " .. test:helloMsg())
- 执行
回到visual studio,开始执行,搞掂。