Cocos2dx-lua luabindings 示例

10 篇文章 1 订阅
4 篇文章 0 订阅

 

我觉得学习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
# templates
prefix = 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 namespace
target_namespace = cc
android_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/include
android_flags = -D_SIZE_T_DEFINED_
clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
#clang_flags = -nostdinc -x c++ -std=c++11
clang_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/android
cocos_flags = -DANDROID
cxxgenerator_headers =
# extra arguments for clang
extra_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 parse
headers = %(cocosdir)s/cocos/my/Hello.h
#headers = /Users/Jacky/Workspace/CocosLuaBinding/frameworks/runtime-src/Classes/CustomClass.h

classes = 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终于搞定!!!



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值