【自动绑定】
参考: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".
3.创建一个ini文件,比如 cocos2dx_custom.ini,参照其他的ini自己做一些修改:
# the prefix to be added to the generated functions. You might or might not use this in your own# templatesprefix = 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 namespacetarget_namespace = cc# what headers to parseheaders = %(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" lookupclasses_have_no_parents = Testabstract_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自动和手动绑定所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)