Coco2dx-3.0中怎样调用LUA

一个用3.0的工具导出类到lua,自己主动生成代码的方法。

曾经要导出c++类到lua。就得手动维护pkg文件,那简直就是噩梦。3.0以后就会感觉生活非常轻松了。

以下我就在说下详细做法。

1、安装必要的库和工具包,以及配置相关环境变量,请依照cocos2d-x-3.0rc0\tools\tolua\README.mdown说得去做,不做赘述。

2、写c++类(我測试用的是cocos2d-x-3.0rc0\tests\lua-empty-test\project\Classes\HelloWorldScene.cpp)

3、写一个生成的python脚本,你不会写,没关系,我们会照猫画虎

1)进入文件夹cocos2d-x-3.0rc0\tools\tolua,复制一份genbindings.py,命名为genbindings_myclass.py

2)把生成文件夹制定到咱project里去,打开genbindings_myclass.py把

output_dir='%s/cocos/scripting/lua-bindings/auto' % project_root

?

改成

output_dir='%s/tests/lua-empty-test/project/Classes/auto'% project_root

3)改动命令參数,把

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'),                     }

改成

cmd_args={'myclass.ini': ('myclass','lua_myclass_auto') }

4)这时你可能问myclass.ini在哪啊,我们下来就写这个文件。

原理一样。我还是照猫画虎。拿cocos2dx_spine.ini改的。

[myclass]
# the prefix to be added to the generated functions. You might or might not use this in your own
# templates
prefix = myclass

# 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 =

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
android_flags = -D_SIZE_T_DEFINED_ 

clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
clang_flags = -nostdinc -x c++ -std=c++11

cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/2d -I%(cocosdir)s/cocos/base -I%(cocosdir)s/cocos/ui -I%(cocosdir)s/cocos/physics -I%(cocosdir)s/cocos/2d/platform -I%(cocosdir)s/cocos/2d/platform/android -I%(cocosdir)s/cocos/math/kazmath -I%(cocosdir)s/extensions -I%(cocosdir)s/external -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s

cocos_flags = -DANDROID -DCOCOS2D_JAVASCRIPT

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/tests/lua-empty-test/project/Classes/HelloWorldScene.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 = HelloWorld

# what should we skip? in the format ClassName::[function function]
# ClassName is a regular expression, but will be used like this: "^ClassName$" functions are also
# regular expressions, they will not be surrounded by "^$". If you want to skip a whole class, just
# add a single "*" as functions. See bellow for several examples. A special class name is "*", which
# will apply to all class names. This is a convenience wildcard to be able to skip similar named
# functions from all classes.

skip =

rename_functions =

rename_classes =

# for all class names, should we remove something when registering in the target VM?
remove_prefix =

# classes for which there will be no "parent" lookup
classes_have_no_parents =

# base classes which will be skipped when their sub-classes found them.
base_classes_to_skip = Ref ProcessBase

# classes that create no constructor
# Set is special and we will use a hand-written constructor
abstract_classes =

# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
script_control_cpp = no
.ini中部分參数的使用方法:
name: 单纯仅仅是名称。
prefix: 最后生成的文件都会以这个命名前缀。如 prefix.cpp, prefix.hpp, prefix_api.js
classes: 你的所需转换的类的名称。必须是所导入的头文件里全部的类,这里能够使用正則表達式来加入多个类。參考cocox2ds.ini。
extra_arguments:一些接口所需的系统參数。如clang包,android ndk包的引入所需的系统參数在此加入,写法能够參照以上三个.ini都有。
headers: 你所须要绑定的头文件路径。
target_namespace:命名空间。

最后生成的JS文件的类,会以这个命名空间开头。比如你的类为sqlite,命名空间为cocos2dx,那么最后生成的就是cocos2dx.sqlite。
rename_functions:能够将你要绑定的方法的名称更改成你所要的。能够更改多个。用逗号隔开,写法參照 SqliteCpp::[sqlite3_execCpp=sqlite3_exec],这个就是将SqliteCpp中的sqlite3_ execCpp方法重命名为sqlite3_exec方法。

rename_classes :同上。重命名类。

skip :跳过你所不须要绑定的方法和类,于是就不生成。

改的时候要注意这些行

[myclass]
prefix = myclass
target_namespace =
headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/HelloWorldScene.h
classes = HelloWorld
skip =
abstract_classes =

4、以下要自己主动生成代码了。打开命令行工具,cd到cocos2d-x-3.0rc0\tools\tolua下。敲入

python genbindings_myclass.py

?

tid=196416#" class="toolbar_item command_help help" style="outline:0px!important; text-decoration:none!important; color:white!important; margin:0px!important; padding:1px 0px 0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:inherit!important; display:block!important">

回车执行。假设前面没问题的话你会在cocos2d-x-3.0rc0\tests\lua-empty-test\project\Classes多了一个目录auto,然后把里面生成lua_myclass_auto.cpp和lua_myclass_auto.hpp增加拽如工程

5、把我们生成的个module在脚本引擎初始化的时候增加lua。

编辑AppDelegate.cpp,包括lua_myclass_auto.hpp头文件,在

LuaEngine* engine = LuaEngine::getInstance();

tid=196416#" class="toolbar_item command_help help" style="outline:0px!important; text-decoration:none!important; color:white!important; margin:0px!important; padding:1px 0px 0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:inherit!important; display:block!important">?

后面增加

register_all_myclass(engine->getLuaStack()->getLuaState());

6、编译执行。这样HelloWorld这个类就被导出到lua了。

測试------------------------------------------------

打开hello.lua,编辑local function main()这个函数

把前面改成

localfunctionmain()
   -- avoid memory leak
   collectgarbage("setpause", 100)
   collectgarbage("setstepmul", 5000)

   localhello = HelloWorld:create()
   localsceneGame = cc.Scene:create()
   sceneGame:addChild(hello)
   cc.Director:getInstance():runWithScene(sceneGame)

   if(1==1)then
        return
   end
……
……

假设还是没懂什么意思,就去參考http://www.tairan.com/archives/5493

 
时间: 2024-10-07 03:49:26

Coco2dx-3.0中怎样调用LUA的相关文章

Unity3d 调用 Luajit C++ DLL 实现调用 Lua脚本

前面介绍了在 Unity3d 中通过 Plugin 功能来调用 C++ DLL 中的函数 以及回调的使用方法,但最终目的还是让 Unity3d 中可以调用 Lua 脚本中的函数,现在来实现. 首先关注前面两篇文章: 1.Unity3d 调用C++ DLL (Win平台) 2.Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数) 文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

cocos2d-x 3.0 在C++中调用lua函数(2)

个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack { public: void call_script_fun(const char* fun) { exe

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据

vs项目中使用c++调用lua

在前一篇文章中,我们已经讲了如何编译lua源码并生成lua.lib(请阅读 使用vs2010编译lua5.1源码生成lua.lib),在新的项目中,我们继续使用之前的项目来学习如何使用c++调用lua. 一.创建项目 同样在该解决方案中,右键解决方案->添加项目->命名为testlua,选择win32控制台程序->不需要其他配置,选择完成. 二.配置项目 右键testlua项目->通用属性->框架和引用->添加新引用,指向lua项目. 右键testlua项目->配

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

C语言中调用Lua

C语言和Lua天生有两大隔阂: 一.C语言是静态数据类型,Lua是动态数据类型 二.C语言需要程序员管理内存,Lua自动管理内存 为了跨越世俗走到一起,肯定需要解决方案. 解决第一点看上去比较容易,C语言中有union. 可是第二点呢?万一C语言正引用着Lua的一个值,Lua自动释放了怎么办? 所以就有了一种比union更好的解决方案:栈. 这是一个虚拟的栈,是沟通两者的桥梁,两者的数据交换全都通过这个栈进行,这样只要不pop,Lua就不会自动释放,而什么时候pop由C语言说了算. 下面是一段喜

c/c++中调用lua第一个例子

首先下载lua源码包,然后分别是make,make linux,make install 注意如果没有make install,那么在#include<lua.h>时,会报找不到lua.h文件的错误. 网上找到一段源码: func.lua --变量定义width=1 ;height=2 ;--lua函数定义,实现加法function sum(a,b)    return a+b ;end--lua函数定义,实现字符串相加function mystrcat(a,b)    return a..b

vs如何在C++中调用Lua

最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscript的应该很容易就能上手,那些Lua独有的特性也是比较有趣,例如不定数目的多参数函数和随意的参数返回值等. 这里想要吐槽一下最近用来学习Lua的书籍<XX开发实践指南>(虽然没有写全名不过搜索过Lua学习资料的童鞋应该都懂是哪本书),不知道是作者问题还是译者问题,有些地方的解释说明有点糟糕,要么不