cocos2d-x-lua如何导出自定义类到lua脚本环境
这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理。
我们的目的是要在lua中使用我们自己定义的类,并且这个类要导出到我们自己的module,意思就是说不是追加到LuaCocos2d.cpp里面,目的是为了使我们的module和coco2d的module完全分离,这样以后更新cocos2d-x版本时,对我们的module没影响。
1、先在Classes文件夹下创建一个类Test(新创建的,名字都是都是自己定,你可以随意起,下面不赘述),代码就简单点,例如
1
2
3
4
5
6
7
8
9
10
11
|
#ifndef _TEST_H_ #define _TEST_H_ class Test { public : Test(); ~Test(); static int foo(){ return 10;} int do (){ return 20;} }; |
2、然后在工程目录创建一个文件夹叫MyLuaModule,和Classes文件夹同级。
3、里面创建个文件MyLuaModule.h,把他拖进工程(add to target勾上),写下一下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#ifndef __MY_LUA_MODULE_H_ #define __MY_LUA_MODULE_H_ extern "C" { #include "tolua++.h" #include "tolua_fix.h" } #include "Test.h" //你新加的类的头文件 TOLUA_API int tolua_MyLuaModule_open(lua_State* tolua_S); //这个函数我们只要在这里先声明就行了,到时候有工具自动给我们生成 #endif // __MY_LUA_MODULE_H_ |
4、到前面创建的MyLuaModule目录下,创建一个文件叫Test.pkg(这个最好和你新加的类名字一样),写这个文件要遵循一些规则:
1) enum keeps the same//枚举不变
2) remove CC_DLL for the class defines, pay attention to multi inherites//移除掉定义的类的CC_DLL宏(我们自定义的类其实没有),注意多重继承
3) remove inline keyword for declaration and implementation//移除inline关键字,不管是声明处还是实践处
4) remove public protect and private//移除public protect and private
5) remove the decalration of class member variable//移除成员变量
6) keep static keyword//保留static关键字
7) remove memeber functions that declared as private or protected//除掉保护的和私有的成员函数
遵循以上7点原则,我们就写下这些
注意:最好就是把你这个类的头文件里的全部复制到pkg里,然后移除掉不必要的,剩下就对了
1
2
3
4
5
|
class Test { static int foo(); int do (){ return 20;} }; |
5、到上面创建的MyLuaModule目录下,创建一个文件叫MyLuaModule.pkg,写下一下代码
1
2
3
|
$#include "MyLuaModule.h" $pfile "Test.pkg" |
这个文件其实是作为一个汇总文件,我们就拿这个去自动生成代码。
1)第一行的目的是为了下面生成cpp的时候都会包含这个头文件。
2)第二行是我们的新加的类的描述文件(以后如果有新的类Test1,那就在写个Test1.pkg,然后再把Test1.pkg加在后面)。
6、我们进入cocos2d的根目录/tools/tolua++,Mac系统解压tolua++.Mac.zip,Win系统解压tolua.rar,把解压得到的tolua++(可执行文件)拷贝到上面创建的MyLuaModule目录下
打开命令行终端,cd到MyLuaModule目录,然后敲 ./tolua++ -o MyLuaModule.cpp MyLuaModule.pkg,把输出的文件MyLuaModule.cpp文件拽进工程(add to target勾上)
注:win的command不需要加./。我看有的人这样写./tolua++ -tCocos2d -o MyLuaModule.cpp MyLuaModule.pkg,-tCocos2d这个参数我真不知道干啥的,谁要是知道,请告诉。-o MyLuaModule.cpp是输出文件名字
7、现在准备工作都做好了,如果前面没有问题的话,是能编译通过的,接下来还有一个重要的步骤,那就是把我们module注入到LuaScriptEngine里。
打开AppDeletegate.cpp,找到CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();这一行,在后面追加一行
tolua_MyLuaClass_open(pEngine->getLuaStack()->getLuaState());同时别忘了include上我们MyLuaModule.h头文件。
8、测试。新建个lua脚本,里面写
1
2
3
|
local test = Test: new () print( "test:do()=" ,test: do ()) print( "Test:foo()=" ,Test:foo()) |
build完运行下看output里的结果把
cocos2d-x-lua如何导出自定义类到lua脚本环境的更多相关文章
- cocos2dx-3.x 导出自定义类到 lua 过程详解
转载请注明出处:http://www.cnblogs.com/Ray1024 一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为 ...
- cocos2dx3.0rc导出自定义类到lua的方法
以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 转载请注明出处http://www.cnblogs.com/mrblue/p/3637910.ht ...
- cocos2dx3.0导出自定义类到lua的方法详细步骤
我写了一个用3.0的工具导出类到lua,自动生成代码的方法. 以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 下面我就在说下具体做法.1.安装必要 ...
- 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
步骤一:首先自定义类(这里Himi自定义类名 “MySprite”) MySprite.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // // ...
- cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用
cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416. 由于目 ...
- cocos2d-x 3.0 在lua中调用自定义类
环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...
- win7系统cocos2dx 3.4 绑定自定义类到Lua
Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...
- 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...
- cocos2dx lua 绑定之二:手动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...
随机推荐
- 【Web API系列教程】3.3 — 实战:处理数据(建立数据库)
前言 在本部分中,你将在EF上使用Code First Migration来用測试数据建立数据库. 在Tools文件夹下选择Library Package Manager,然后选择Package Ma ...
- 腾讯QQ积分CSRF导致积分任意挥霍(我的积分为什么少了)
触发点:http://jifen.qq.com/html5/index.html?ADTAG=JIFEN.MART.INDEX 随意兑换一个商品: 因为刚才我已经兑换过了,所以积分没有了.. 没关系, ...
- Objective-C语法之扩展(Extension)的使用
Objective-C 2.0增加了Class Extension用于解决两个问题: 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读.私有可读写的属性 可声明私有方法: ...
- repo_folder
-- Create table create table REPO_FOLDER ( UUID ) not null, VALID ) not null, CREATE_TIME ) not null ...
- nuget类库xml说明以及类库说明文件添加到包中
1.nuget包制作添加xml操作:项目右键属性,生成配置输出xml文档文件,debug,release都配置一下,项目右键 yesway.redis.csproj 文件增加: 添加类库说明文件con ...
- 5 -- Hibernate的基本用法 --4 8 外连接抓取属性
外连接抓取能限制执行SQL语句的次数来提高效率,这种外连接抓取通过在单个select语句中使用outer join来一次抓取多个数据表的数据. 外连接抓取允许在单个select语句中,通过@ManyT ...
- lua 根据函数名字符串来执行函数
function myfunction(msg) print("this is msg fun " .. msg); end local fun =_G["myfunct ...
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...
- PostgreSQL恢复误删数据
在Oracle中:删除表或者误删表记录:有个闪回特性,不需要停机操作,可以完美找回记录.当然也有一些其他的恢复工具:例如odu工具,gdul工具.都可以找回数据.而PostgreSQL目前没有闪回特性 ...
- .net页面生命周期【转】
.Net 页面生命周期IIS 所收到的对某 Microsoft ASP.NET 页面的每个请求都被移交给 ASP.NET HTTP 管线.HTTP 管线由一系列托管对象组成,这些对象按顺序处理该请求, ...