一个用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++11cocos_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)scocos_flags = -DANDROID -DCOCOS2D_JAVASCRIPTcxxgenerator_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
?

回车执行。假设前面没问题的话你会在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();
?

后面增加

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

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



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

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

把前面改成

localfunctionmain()-- avoid memory leakcollectgarbage("setpause", 100)collectgarbage("setstepmul", 5000)localhello = HelloWorld:create()localsceneGame = cc.Scene:create()sceneGame:addChild(hello)cc.Director:getInstance():runWithScene(sceneGame)if(1==1)thenreturnend
……
……

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

 

Coco2dx-3.0中怎样调用LUA相关推荐

  1. TC2.0中怎样调用汇编程序

    TC是美国BORLAND 公司在IBM PC机上开发的一个高效.优化的C编译程序,它自带高效的全屏幕编辑程序,在集成开发环境下可支持编辑.编译.连接调试和运行等过程连续完成.     TC提供了与汇编 ...

  2. lua运行外部程序_二、C++调用Lua函数

    上一篇文章中我们已经把测试环境搭建完毕了,接下来就用上次的项目工程进行代码测试和分析. 这篇文章主要讲在C++中怎么调用Lua中的函数add,并且把lua中函数计算结果返回给C++,然后在打印出来计算 ...

  3. Java生态/Redis中如何使用Lua脚本

    文章目录 一.安装LUA 1)简单使用 二.lua语法简介 1.注释 1)单行注释 2)多行注释 2.关键字 3.变量 1)全局变量 2)局部变量 4.数据类型 1)Lua数组 2)字符串操作 5.i ...

  4. 留念,第一次在C中调用lua成功!

    反反复复学lua N多次了,这次终于在C中调用lua成功了!一大进步啊! 记录下过程: 1.找到代码如下: //add.c #include        <stdio.h> #inclu ...

  5. 安卓JAVA调用lua_android中java与lua的相互调用

    Android Studio Lua环境配置 开发环境 1. Android Studio 3.5 2. java sdk: 1.8.0 3.android sdk:28 配置环境 添加lua支持语法 ...

  6. Ajax 1.0 中使用web控件调用后台方法的用法.

    今天在做页面文本框审核的时候发现个Ajax 1.0 中使用web控件调用后台方法的一个不爽的地方. 把该调用方法发上来供大家参考. 首先我们创建一个MasterPage.master文件. 在页面上放 ...

  7. .NET2.0中,Winform程序如何异步调用Web Service呢?[Demo下载]——与.net1.1环境下比较...

    最近在MSDN上看到一个在.NET1.1中Winform程序异步调用WebService的例子 我准备模仿着迁移到.NET2.0环境中,遗憾的是,一切不是那么简单. 首先,.net1.1中调用的Web ...

  8. [转]在.NET CF2.0中调用DirectShow来处理视音频数据

    [转]在.NET CF2.0中调用DirectShow来处理视音频数据 转自:http://www.winbile.net/bbs/forums/threads/1000586.aspx 于渊 200 ...

  9. Unity中SteamVR2.0 手柄交互调用方式

    再次接触到HTC Vive项目时发现交互已经跟几年前的写法不一样了,而且VRTK插件也需要找对应的版本才行,否则会报错,版本已经不兼容. 这里总结下我在项目中遇到的手柄交互在Unity中的调用: 1. ...

最新文章

  1. python accept解析_python中requests库使用方法详解
  2. DOS批处理延时技术
  3. 都2020 了,最流行的密码居然依旧是...
  4. 简单python画圣诞树图片-python圣诞树代码
  5. 十三、开多线程,咱们一起来斗图
  6. axure web组件下载_实践干货:Axure插入图标的4种办法
  7. python程序设计第一章答案_Python《学习手册:第一章-习题》
  8. msp430入门编程46
  9. 3个阶段 项目征名_项目管理的3个关键动作:启动、推进、复盘
  10. axis idea 设置apache_利用IDEA创建Web Service服务端和客户端的详细过程
  11. Linux 命令(114)—— nl 命令
  12. fopen /open,read/write和fread/fwrite区别
  13. 糗百网站服务器正在升级中,网站紧急升级中
  14. 锐捷交换机VRRP配置
  15. win10便签常驻桌面_便签,草图,截屏草图,一个win10自带的小工具统统解决!...
  16. 阡陌路 - 自动档车的开法(转)
  17. Maya获取材质ShadingEngine信息
  18. MySQL索引重点问题总结(需要完整脑图的联系我)
  19. C语言指针类型的意义
  20. 关于HTML知识点的小总结

热门文章

  1. chrome应用程序无法启动因为并行配置不正确_Win8打不开软件提示并行配置不正确的解决方法...
  2. 计算机小知识点GIF,计算机基础全部知识点 讲解.doc
  3. html如何把上边角做成椭圆,使用css3的border-radius和border制作半圆、三角、椭圆等各种图形...
  4. Linux设置fifo大小,linux fifo 的一个小实验 -- 缓存大小
  5. 在linux下磁盘挂在操作,linux下挂载磁盘操作
  6. MQ中将消息发送至远程队列的配置
  7. 数据库笔记07:实施数据完整性
  8. 利用CSS实现悬停下拉菜单
  9. 针对《关于郝培强的《为什么我们招聘的时候绝不要传智播客的学生?》》的看法
  10. C ++ 类 | 类的创建和使用_1