大佬教程收集整理的这篇文章主要介绍了cocos2dx——lua自动和手动绑定,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
【自动绑定】
参考:http://my.oschina.net/skyhacker2/blog/298397
主要是通过引擎自带的tools/tolua,主要步骤如下:
1.编写好要导出的c++类,如果是libcocos2d里添加,需要添加导出标记:class CC_DLL Test
2.到tolua目录根据README.mdown配置好环境:
* Make sure that you have installed `android-ndk-r9b`. * Download python2.7.3 (32bit) from (http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi). * Add the installed path of python (e.g. C:\Python27) to windows environment variable named 'PATH'. * Download pyyaml from http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe and install it. * Download pyCheetah from https://raw.github.com/dumganhar/my_old_cocos2d-x_BACkup/download/downloads/Cheetah.zip,unzip it to "C:\Python27\Lib\site-packages" * Set environment variables (`NDK_ROOT`) * Go to "cocos2d-x/tools/tolua" folder,and run "genbindings.py". The generated codes will be under "cocos\scripTing\auto-generated\js-bindings".
# the prefix to be added to the generated functions. You might or might not use this in your own # templates prefix = cocos2dx_custom # 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 # what headers to parse headers = %(cocosdir)s/cocos/for_lua/Test.h # what classes to produce code for. You can use regular expressions here. When tesTing the regular # expression,it will be enclosed in "^$",like this: "^Menu*$". classes = Test.* skip = # classes for which there will be no "parent" lookup classes_have_no_parents = Test abstract_classes =4.拷贝一份genbindings_custom.py,修改cmd_args:
cmd_args = {'cocos2dx_custom.ini' : ('cocos2dx_custom','lua_cocos2dx_custom_auto'),\ }5.运行 genbindings_custom.py会生成xx_auto.h/cpp到cocos\scripTing\lua-bindings\auto目录,然后你添加到引擎的libluacocos2d工程去
6.要在lua中使用,还在启动时注册。现在3.7的版本里AppDelegate::applicationDidFinishLaunching会调用lua_module_register,所以:
#include "lua_cocos2dx_custom_auto.hpp" #include "fun.h" int lua_module_register(lua_State* L) { register_cocosdenshion_module(L); register_all_cocos2dx_custom(L); register_foo(L); return 1; }7.然后你就可以在lua里使用了:
-- test custom local msg = cc.Test:HelloMsg() print(msg)
【手动绑定】
参考:http://www.tairan.com/archives/5493
1.创建c++类(fun.h):
#pragma once #include <iostream> #include <sstream> extern "C" { #include <lua.h> #include <lauxlib.h> #include <lualib.h> } class Foo { public: Foo(const std::string & Name) : name(Name) { std::cout << "Foo is born" << std::endl; } std::string Add(int a,int b) { std::stringstream ss; ss << name << ": " << a << " + " << b << " = " << (a + b); return ss.str(); } ~Foo() { std::cout << "Foo is gone" << std::endl; } private: std::string name; }; void register_foo(lua_State *L);2.导出到lua(fun.cpp):
#include "fun.h" int l_foo_constructor(lua_State *L) { const char *name = luaL_checkString(L,1); Foo **udata = (Foo**)lua_newuserdata(L,sizeof(Foo*)); *udata = new Foo(Name); luaL_getmetatable(L,"luaL_Foo"); // stack: // -1 metatable "luaL_Foo" // -2 userdata // -3 String param lua_setmetatable(L,-2); return 1; } Foo* l_checkFoo(lua_State *L,int n) { return *(Foo**)luaL_checkudata(L,n,"luaL_Foo"); } int l_foo_Add(lua_State *L) { Foo *foo = l_checkFoo(L,1); int a = luaL_checknumber(L,2); int b = luaL_checknumber(L,3); std::string s = foo->Add(a,b); lua_pushString(L,s.c_str()); // stack: // -1 result String // -2 metatable "luaL_Foo" // -3 userdata // -4 String param return 1; } int l_foo_destructor(lua_State *L) { Foo *foo = l_checkFoo(L,1); delete foo; return 0; } void register_foo(lua_State *L) { luaL_Reg sFooRefs[] = { { "new",l_foo_constructor },{ "add",l_foo_Add },{ "__gc",l_foo_destructor },{ NULL,NULL } }; luaL_newmetatable(L,"luaL_Foo"); luaL_register(L,NULL,sFooRefs); lua_pushvalue(L,-1); // stack: // -1: metatable "luaL_Foo" // -2: metatable "luaL_Foo" // this pops the stack lua_setfield(L,-1,"__index"); lua_setglobal(L,"Foo"); }3.启动时注册
4.在lua中使用:
function Foo:speak() print("Hello,i am a Foo") end local foo = Foo.new("adfan") local m = foo:add(3,4) print(m) foo:speak() Foo.add_ = Foo.add function Foo:add(a,b) return "magic: " .. self:add_(a,b) end m = foo:add(9,8) print(m)说明:手动绑定的话,参照引擎导出的那些manual.cpp即可,用tolua的那些接口很方便,用上面的这种方式主要是展示这个流程
以上是大佬教程为你收集整理的cocos2dx——lua自动和手动绑定全部内容,希望文章能够帮你解决cocos2dx——lua自动和手动绑定所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。