Cocos2dx-lua luabindings 示例

来源:互联网 发布:斯坦福商学院知乎 编辑:程序博客网 时间:2024/05/21 00:44

 

我觉得学习cocosLua的luabindings是一个重要的难点,而且这方面的资源也少,不过还好,找了些视频教程,自己也动手配置了下,两天时间终于搞出来了。

1. 编辑Hello.h文件 , 保存到目录:项目路径/frameworks/cocos2d-x/cocos/my, my是自己新建的目录,存放luabindings的c++部分代码

#ifndef __HELLO__#define __HELLO__#include "cocos2d.h"namespace cocos2d{class Hello: public Ref{public:virtual bool init(){return true;}CREATE_FUNC(Hello);void sayHello(){log("Hello Cocos Lua...");}Hello(){};~Hello(){};};};#endif


2.新建INI文件,保存到目录:项目路径/frameworks/cocos2d-x\tools\tolua\cocos2dx_hello.ini

[cocos2dx_hello]# the prefix to be added to the generated functions. You might or might not use this in your own# templatesprefix = cocos2dx_hello# create a target namespace (in javascript, this would create some code like the equiv. to `ns = ns || {}`)# all classes will be embedded in that namespacetarget_namespace = ccandroid_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/includeandroid_flags = -D_SIZE_T_DEFINED_clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include#clang_flags = -nostdinc -x c++ -std=c++11clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/my -I%(cocosdir)s/cocos/base -I%(cocosdir)s/cocos/platform/androidcocos_flags = -DANDROIDcxxgenerator_headers =# extra arguments for clangextra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s# what headers to parseheaders = %(cocosdir)s/cocos/my/Hello.h#headers = /Users/Jacky/Workspace/CocosLuaBinding/frameworks/runtime-src/Classes/CustomClass.hclasses = Hello.*skip =rename_functions =rename_classes =remove_prefix =classes_have_no_parents =base_classes_to_skip =abstract_classes =script_control_cpp = no


要修改的地方:

[cocos2dx_hello]:之前是cocos2dx_****

prefix = cocos2dx_hello:

clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include,注意ndk的版本号,这个不对的话可能会报错

clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__,-U __SSE__是新加的,不加可能会报错

classes = Hello.*

headers = %(cocosdir)s/cocos/my/Hello.h,指向刚新加的C++文件

3.修改 项目路径/frameworks/cocos2d-x\tools\tolua\genbindings.py

        cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \                    'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \                    'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \                    'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \                    'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \                    'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \                    'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \                    'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \                    'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \                    'cocos2dx_cocosbuilder.ini': ('cocos2dx_cocosbuilder', 'lua_cocos2dx_cocosbuilder_auto'), \                    'cocos2dx_cocosdenshion.ini': ('cocos2dx_cocosdenshion', 'lua_cocos2dx_cocosdenshion_auto'), \                    'cocos2dx_3d.ini': ('cocos2dx_3d', 'lua_cocos2dx_3d_auto'), \                    'cocos2dx_audioengine.ini': ('cocos2dx_audioengine', 'lua_cocos2dx_audioengine_auto'), \                    'cocos2dx_csloader.ini' : ('cocos2dx_csloader', 'lua_cocos2dx_csloader_auto'), \                    'cocos2dx_experimental_webview.ini' : ('cocos2dx_experimental_webview', 'lua_cocos2dx_experimental_webview_auto'), \                    'cocos2dx_physics3d.ini' : ('cocos2dx_physics3d', 'lua_cocos2dx_physics3d_auto'), \                    'cocos2dx_navmesh.ini' : ('cocos2dx_navmesh', 'lua_cocos2dx_navmesh_auto'), \                    'cocos2dx_hello.ini' : ('cocos2dx_hello', 'lua_cocos2dx_hello_auto'), \                    }

在最后一行新加一行:'cocos2dx_hello.ini' : ('cocos2dx_hello', 'lua_cocos2dx_hello_auto'), \

运行此文件:python genbindings.py. 各种报错啊,首先需要下载两个python的模块PyYAML,Cheetah, 还需要Android NDK,全都重装了一遍,

python与PyYAML需要32位的

python2.7: http://pan.baidu.com/s/1skMX8rN

PyYAML-3.12.win32-py2.7: http://pan.baidu.com/s/1eSOWhd4

Cheetah-2.0.1: http://pan.baidu.com/s/1slUFsx3

NDK为android-ndk-r9b 64位版本



查看NDK llvm版本


就使用标注的版本吧


修改genbindings.py文件中llvm版本:




再重新运行文件:


运行成功,在 项目路径/frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto生成两个文件



4.在项目的C++代码中注册luabindings

1)打开lua_module_register.h



#ifndef __LUA_TEMPLATE_RUNTIME_FRAMEWORKS_RUNTIME_SRC_CLASSES_LUA_MODULE_REGISTER_H__#define __LUA_TEMPLATE_RUNTIME_FRAMEWORKS_RUNTIME_SRC_CLASSES_LUA_MODULE_REGISTER_H__#include "lua.h"#include "scripting/lua-bindings/manual/Lua-BindingsExport.h"CC_LUA_DLL  int  lua_module_register(lua_State* L);#endif  // __LUA_TEMPLATE_RUNTIME_FRAMEWORKS_RUNTIME_SRC_CLASSES_LUA_MODULE_REGISTER_H__


lua_module_register这个方法就是注册luabindings的方法,不过这个方法已经在libluacocos2dx库中实现了,不能再向这个方法里加东西了。那就只能改调用了,此方法是在AppDelegate.cpp中调用的



2)创建一个新的注册方法


替换注册函数



5. vs2013编译项目

报出打不到头文件错误:

引入头文件目录



再报找不到链接错误



将cpp文件加入到工程中



再编译,则编译成功

6. 在lua中调用C++代码,main.lua



sublime text中F7运行(我已配置好sublime对cocoslua的运行环境)




到此,luabindings终于搞定!!!



原创粉丝点击