使用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
|
//// // //// ////#ifndef#define#includeusingnamespacecocos2d;classMySpritepublicCCSprite{public: staticMySprite*constchar*};#endif |
MySprite.cpp
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//// // //// ////#includeMySprite*constchar* MySprite*newMySprite(); if(sp sp->setPosition(ccp(100,100)); sp->autorelease(); returnsp; } CC_SAFE_DELETE(sp); returnNULL;} |
步骤二:利用tolua++编译我们创建的pkg,将自定义类嵌入LuaCocos2d.cpp中
首先我们到cocos2dx引擎目录下找到tools下的tolua++文件夹。
然后你看到很多的pkg文件,你可以使用文本打开,就会发现都是Cocos2dx引擎封装的类、函数定义,如下CCSprite.pkg
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*typedef //! CC_HONOR_PARENT_TRANSFORM_TRANSLATE //! CC_HONOR_PARENT_TRANSFORM_ROTATE //! CC_HONOR_PARENT_TRANSFORM_SCALE //! CC_HONOR_PARENT_TRANSFORM_SKEW //! CC_HONOR_PARENT_TRANSFORM_ALL }*/classCCSpritepublicCCNode{ voidsetDirty(boolbDirty); boolisDirty(void); ccV3F_C4B_T2F_Quadvoid); CCRectvoid); //bool boolisTextureRectRotated(void); voidsetAtlasIndex(unsignedintuAtlasIndex); unsignedintgetAtlasIndex(void); //void voidsetTextureAtlas(CCTextureAtlas CCTextureAtlas*void); //void //CCSpriteBatchNode* //void //ccHonorParentTransform voidsetBlendFunc(ccBlendFunc ccBlendFuncvoid); CCPointvoid); voidignoreAnchorPointForPosition(boolnewValue); voidsetFlipX(boolbFlipX); voidsetFlipY(boolbFlipY); boolisFlipX(void); boolisFlipY(void); voidremoveChild(CCNode*boolbCleanUp); voidremoveAllChildrenWithCleanup(boolbCleanup); voidreorderChild(CCNode*intzOrder); voidaddChild(CCNode* voidaddChild(CCNode*intzOrder); voidaddChild(CCNode*intzOrder,inttag); voidsortAllChildren(); //void voidsetRotation(floatrotation); voidsetSkewX(floatsx); voidsetSkewY(floatsy); voidsetScale(floatfScale); voidsetScaleX(floatfScaleX); voidsetScaleY(floatfScaleY); voidsetVertexZ(floatfVertexZ); voidsetAnchorPoint(constCCPoint voidsetVisible(boolbVisible); voidsetOpacity(GLubyte GLubytevoid); voidsetColor(ccColor3B ccColor3Bvoid); voidsetOpacityModifyRGB(boolbValue); boolisOpacityModifyRGB(void); voidsetTexture(CCTexture2D CCTexture2D*void); voidupdateTransform(void); //void voidsetTextureRect(CCRect voidsetTextureRect(CCRectboolrotated, voidsetVertexRect(CCRect //void voidsetDisplayFrame(CCSpriteFrame boolisFrameDisplayed(CCSpriteFrame CCSpriteFrame*void); voidsetBatchNode(CCSpriteBatchNode* CCSpriteBatchNode* voidsetDisplayFrameWithAnimationName(constchar*animationName,intframeIndex); staticCCSprite* staticCCSprite* staticCCSprite* staticCCSprite*constchar*pszSpriteFrameName); staticCCSprite*constchar*pszFileName, staticCCSprite*constchar*pszFileName); staticCCSprite*}; |
没错,我们也会按照类似方式进行创建我们自定义类的pkg文件。
我们自定义一个文件(文本、xcode等都可以),后缀 .pkg ,然后将Himi自定义的MySprite类定义到pkg中,如下:
注意:只要自定义类.h中的内容,至于cpp的实现,binding后lua自动调用你类的函数
MySprite.pkg
|
1
2
3
|
classMySpritepublicCCSprite{ staticMySprite*constchar*}; |
在pkg中我只是定义了创建函数而已,至于更多的函数就交给大家自定义啦,另外我们注意书写pkg时是需要几条规则的,其实在tolua++这个文件夹中我们也能看到有一个名字叫 README 的文件,打开如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
1.Generatingthelua<-->C Buildforwindows(build.bat)andunix(build.sh)are togeneratetherelevantaftermodifyingthe.pkg scriptsrunthefollowing: tolua++.exe-L-o2d.cpp2d.pkg Thisthebindingsfileandpatchitwithcome2dx specific Onrun"make"tothebindings if/when2.Writing 1)enumthesame 2)removeCC_DLLfortheclass,paytomulti 3)removeinlinefordeclarationandimplementation 4)removepublicandprivate 5)removetheof 6)keep 7)removememeberthatdeclaredasprivateorprotected |
这个文件声明了书写pkg的规则,不多赘述。
书写好我们的pkg之后,将pkg文件放置此tolua++文件夹下即可,然后配置我们tolua++工具。
继续在tolua++文件夹中解压tolua++.Mac.zip 文件,会得到一个tolua++的工具,如下图:

解压出工具之后,我们还要在tolua++文件夹中,配置tolua++路径,打开“build.sh”文件,如下:

这里 TOLUA 是tolua++工具的位置(路径后面要架上 /tolua++ 表示这个工具),最下面配置的是编译后的luaCocos2d.cpp文件导出的位置,Himi这里配置到桌面,配置如下:

最后,我们要将我们定义的pkg文件注册到 tolua++文件夹下的Cocos2d.pkg中,如下:

如上步骤都OK后,我们就可以使用“终端”,先cd到tolua++的文件夹下,然后使用“make”命令执行tolua++工具 或者终端输入 ./build.sh 。
(如果这里终端不能正常执行, 请继续修改tolua++文件夹下的: makefile ,将其路径配置一下即可。)
终端正常执行后,会在一开始指定的目录生成LuaCocos2d.cpp 文件,且其中已经binding好了自定义类,将生成的LuaCocos2d.cpp替换到你项目的/libs/lua/cocos2dx_support下的LuaCocos2d.cpp 文件。
Himi建议生成的LuaCocos2d.cpp 文件路径直接设置你的项目的/libs/lua/cocos2dx_support下很方便
注意:这时候LuaCoco2d.cpp中虽然已经binding了我们的自定义类,但是没有引用我们的头文件,所以我们还需要在LuaCocos2d.h中倒入我们自定义类.h 。
步骤三:Lua测试我们的自定义类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
--function(msg) print("----------------------------------------") print("LUA (msg).."\n") print(debug.traceback()) print("----------------------------------------")endlocalfunctionmain() -- collectgarbage("setpause",100) collectgarbage("setstepmul",5000) localcclog=function(...) print(string.format(...)) end require"hello2" cclog("result (3,5)) --------------- -- localfunction() locallayerFarm=CCLayer:create() localfont=:create("Himi,"Verdana-BoldItalic",20) font:setPosition(ccp(220,260)) layerFarm:addChild(font) localms =MySprite:createMS("Icon.png") layerFarm:addChild(ms) returnlayerFarm end -- localsceneGame=CCScene:create() sceneGame:addChild(createLayerFarm()) CCDirector:sharedDirector():runWithScene(sceneGame)endxpcall(main,__G__TRACKBACK__) |
运行截图如下:

原文链接: http://www.himigame.com/lua-game/1259.html
使用tolua++编译pkg,从而创建自定义类让Lua脚本使用的更多相关文章
- cocos2d-x-lua如何导出自定义类到lua脚本环境
这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理. 我们的目的是要在 ...
- 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...
- cocos2dx 2.x版本:简化提炼tolua++绑定自定义类到lua中使用
cocos2dx的3.x版本已经提供了更好地绑定方式,网上有很多相关的教程,这里给一个链接:http://www.cocoachina.com/bbs/read.php?tid=196416. 由于目 ...
- 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.安装必要 ...
- win7系统cocos2dx 3.4 绑定自定义类到Lua
Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...
- java创建自定义类的数组
今天在学图论的最小生成树,开始一直在想是用邻接矩阵还是关联矩阵来表示图,但是发现这样都会有好多空间浪费.于是我就自定义一个边的类,里面包含了权值,关联的端点1,端点2,和图的表示字母.发现我想创建11 ...
- java创建自定义类的对象数组
1 public class Student{ 2 static int number = 0; // 静态变量的访问可以不用创建类的实例就可就可使用< 类名.属性 >的方法访问 3 ...
随机推荐
- Toad for Oracle 12.1下载地址
32 位版: http://us-downloads.quest.com/Repository/support.quest.com/Toad for Oracle/12.1/Software/Toad ...
- LeetCode 345
Reverse Vowels of a String Write a function that takes a string as input and reverse only the vowels ...
- hdu 4638 树状数组
思路:将查询区间按右节点的升序排列,然后插入第i个数的时候,若nun[i]+1已经插入,那么就update(pre[num[i]+1],-1):pre[]表示的是该数的位置.同样若 num[i]-1存 ...
- 原生js 实现的瀑布流
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- CSS3 box-flex属性和box-orient属性
比较有意思的是虽然目前没有浏览器支持box-flex,box-orient属性,但CSS3问世以来,这两个属性却一直很火.2014年阿里校招第5题要求使用CSS3中的功能实现三个矩形的布局,总的宽度为 ...
- C# PLINQ 内存列表查询优化历程
产品中(基于ASP.NET MVC开发)需要经常对药品名称及名称拼音码进行下拉匹配及结果查询.为了加快查询的速度,所以我最开始就将其加入内存中(大约有六万五千条数据). 下面附实体类. public ...
- Jquery EasyUI的datagrid页脚footer使用及数据统计
最近做一个统计类的项目中遇到datagrid数据显示页脚footer合计的问题,对于构造统计结果数据格式,是在程序端构造一个{"rows":[],"total" ...
- MySQL之经典语句
数据库的创建:(例如创建名为ConstructionDB的数据库) --创建SelfStudy数据库 CREATE DATABASE ConstructionDB ON PRIMARY --创建主数据 ...
- 新年第一次分享sqlserver技术
走向DBA[MSSQL篇] - 从SQL语句的角度提高数据库的访问性能 最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带来的 ...
- vs2005_the breakpoint will not currently be hit. The source code is different from the original verison.
公司开发只能用英文版的VS2005 (雅蠛蝶) Tool-->Options-->Debugging->General: 把Require source files to exact ...