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,开始执行,搞掂。