使用tolua++编译pkg,从而创建自定义类让Lua脚本使用 for Mac

本站文章均为  李华明Himi  原创,转载务必在明显处注明:(作者新浪微博:  @李华明Himi 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua-game/1259.html 

此篇基本【COCOS2DX(2.X)_LUA开发之三】在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解

在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类供Lua脚本调用使用,当时出于Himi对Lua研究不够深入,所以当时使用了笨方法手动添加的方式进行的,那么本篇将介绍利用tolua++快速将我们自定义的c2dx类嵌入,供 lua脚本使用。

首先介绍整个过程:

之前我们的过程: 自定义类->手动到LuaCoco2d.cpp中手动添加binding->lua使用

现在我们的过程是: 自定义类->使用tolua++工具编译到LuaCoco2d.cpp中->lua使用

下面进行详细步骤讲解:

步骤一:首先自定义类(这里Himi自定义类名 “MySprite”)

MySprite.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//
//  MySprite.h
//  mtet
//
//  Created by Himi on 13-4-7.
//
//
 
#ifndef __mtet__MySprite__
#define __mtet__MySprite__
 
#include "cocos2d.h"
using namespace cocos2d;
 
class MySprite : public CCSprite{
public :
     static MySprite* createMS( const char * fileName);
};
#endif /* defined(__mtet__MySprite__) */

 

MySprite.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//
//  MySprite.cpp
//  mtet
//
//  Created by Himi on 13-4-7.
//
//
 
#include "MySprite.h"
MySprite* MySprite::createMS( const char * fileName){
     MySprite* sp = new MySprite();
     if (sp && sp->initWithFile(fileName)){
         sp->setPosition(ccp(100,100));
         sp->autorelease();
         return sp;
     }
     CC_SAFE_DELETE(sp);
     return NULL;
}

步骤二:利用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 enum {
     //! Translate with it's parent
     CC_HONOR_PARENT_TRANSFORM_TRANSLATE =  1 << 0,
     //! Rotate with it's parent
     CC_HONOR_PARENT_TRANSFORM_ROTATE    =  1 << 1,
     //! Scale with it's parent
     CC_HONOR_PARENT_TRANSFORM_SCALE     =  1 << 2,
     //! Skew with it's parent
     CC_HONOR_PARENT_TRANSFORM_SKEW      =  1 << 3,
 
     //! All possible transformation enabled. Default value.
     CC_HONOR_PARENT_TRANSFORM_ALL       =  CC_HONOR_PARENT_TRANSFORM_TRANSLATE | CC_HONOR_PARENT_TRANSFORM_ROTATE | CC_HONOR_PARENT_TRANSFORM_SCALE | CC_HONOR_PARENT_TRANSFORM_SKEW,
 
} ccHonorParentTransform;
*/
class CCSprite : public CCNode
{
     void setDirty( bool bDirty);
     bool isDirty( void );
 
     ccV3F_C4B_T2F_Quad getQuad( void );
 
     CCRect getTextureRect( void );
     //bool isUsesBatchNode(void);
     bool isTextureRectRotated( void );
 
     void setAtlasIndex(unsigned int uAtlasIndex);
     unsigned int getAtlasIndex( void );
     //void setUsesSpriteBatchNode(bool bUsesSpriteBatchNode);
     void setTextureAtlas(CCTextureAtlas *pobTextureAtlas);
     CCTextureAtlas* getTextureAtlas( void );
     //void setSpriteBatchNode(CCSpriteBatchNode *pobSpriteBatchNode);
     //CCSpriteBatchNode* getSpriteBatchNode(void);
     //void setHonorParentTransform(ccHonorParentTransform eHonorParentTransform);
     //ccHonorParentTransform getHonorParentTransform(void);
     void setBlendFunc(ccBlendFunc blendFunc);
     ccBlendFunc getBlendFunc( void );
 
     CCPoint getOffsetPosition( void );
 
     void ignoreAnchorPointForPosition( bool newValue);
     void setFlipX( bool bFlipX);
     void setFlipY( bool bFlipY);
     bool isFlipX( void );
     bool isFlipY( void );
 
     void removeChild(CCNode* pChild, bool bCleanUp);
     void removeAllChildrenWithCleanup( bool bCleanup);
     void reorderChild(CCNode* pChild, int zOrder);
     void addChild(CCNode* pChild);
     void addChild(CCNode* pChild, int zOrder);
     void addChild(CCNode* pChild, int zOrder, int tag);
     void sortAllChildren();
     //void setPosition(CCPoint pos);
     void setRotation( float rotation);
     void setSkewX( float sx);
     void setSkewY( float sy);
     void setScale( float fScale);
     void setScaleX( float fScaleX);
     void setScaleY( float fScaleY);
     void setVertexZ( float fVertexZ);
     void setAnchorPoint( const CCPoint & anchor);
     void setVisible( bool bVisible);
 
     void setOpacity(GLubyte opacity);
     GLubyte getOpacity( void );
 
     void setColor(ccColor3B color3);
     ccColor3B getColor( void );
     void setOpacityModifyRGB( bool bValue);
     bool isOpacityModifyRGB( void );
 
     void setTexture(CCTexture2D *texture);
     CCTexture2D* getTexture( void );
 
     void updateTransform( void );
     //void useSelfRender(void);
     void setTextureRect(CCRect rect);
     void setTextureRect(CCRect rect, bool rotated, CCSize size);
     void setVertexRect(CCRect rect);
     //void useBatchNode(CCSpriteBatchNode *batchNode);
     void setDisplayFrame(CCSpriteFrame *pNewFrame);
     bool isFrameDisplayed(CCSpriteFrame *pFrame);
     CCSpriteFrame* displayFrame( void );
     void setBatchNode(CCSpriteBatchNode* pBatchNode);
     CCSpriteBatchNode* getBatchNode();
     void setDisplayFrameWithAnimationName( const char *animationName, int frameIndex);
 
     static CCSprite* createWithTexture(CCTexture2D *pTexture);
     static CCSprite* createWithTexture(CCTexture2D *pTexture, CCRect rect);
     static CCSprite* createWithSpriteFrame(CCSpriteFrame *pSpriteFrame);
     static CCSprite* createWithSpriteFrameName( const char *pszSpriteFrameName);
     static CCSprite* create( const char *pszFileName, CCRect rect);
     static CCSprite* create( const char *pszFileName);
     static CCSprite* create();
};

 

没错,我们也会按照类似方式进行创建我们自定义类的pkg文件。

我们自定义一个文件(文本、xcode等都可以),后缀 .pkg ,然后将Himi自定义的MySprite类定义到pkg中,如下:

注意:只要自定义类.h中的内容,至于cpp的实现,binding后lua自动调用你类的函数

MySprite.pkg

1
2
3
class MySprite : public CCSprite{
     static MySprite* createMS( const char * fileName);
};

在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. Generating the lua < -->C bindings with tolua++
 
     Build scripts for windows ( build.bat ) and unix ( build.sh ) are provided
     to generate the relevant files after modifying the .pkg files.  These
     scripts basically run the following command :
 
         tolua + + .exe - L basic.lua - o LuaCocos 2 d.cpp Cocos 2 d.pkg
 
     This will generate the bindings file and patch it with come cocos 2 dx
     specific modifications.
 
     On POSIX systems you can also just run "make" to build the bindings
     if / when you change .pkg files.
 
2. Writing .pkg files
 
     1 ) enum keeps the same
     2 ) remove CC_DLL for the class defines , pay attention to multi inherites
     3 ) remove inline keyword for declaration and implementation
     4 ) remove public protect and private
     5 ) remove the decalration of class member variable
     6 ) keep static keyword
     7 ) remove memeber functions that declared as private or protected

 

这个文件声明了书写pkg的规则,不多赘述。

书写好我们的pkg之后,将pkg文件放置此tolua++文件夹下即可,然后配置我们tolua++工具。

继续在tolua++文件夹中解压tolua++.Mac.zip 文件,会得到一个tolua++的工具,如下图:

 

QQ20130407-2

 

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

1

 

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

QQ20130407-4

 

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

QQ20130407-7

 

如上步骤都OK后,我们就可以使用“终端”,先cd到tolua++的文件夹下,然后使用“make”命令执行tolua++工具。

(如果这里终端不能正常执行, 请继续修改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
-- for CCLuaEngine traceback
function __G__TRACKBACK__ ( msg )
     print ( "----------------------------------------" )
     print ( "LUA ERROR: " .. tostring ( msg ) .. "\n" )
     print ( debug.traceback ( ) )
     print ( "----------------------------------------" )
end
 
local function main ( )
     -- avoid memory leak
     collectgarbage ( "setpause" , 100 )
     collectgarbage ( "setstepmul" , 5000 )
 
     local cclog = function ( ... )
         print ( string .format ( ... ) )
     end
 
     require "hello2"
     cclog ( "result is " .. myadd ( 3 , 5 ) )
 
     ---------------
 
     -- create farm
     local function createLayerFarm ( )
         local layerFarm = CCLayer : create ( )
 
         local font = CCLabelTTF : create ( "Himi 使用tolua++ binding自定义类" , "Verdana-BoldItalic" , 20 )
         font : setPosition ( ccp ( 220 , 260 ) )
         layerFarm : addChild ( font )
 
         local ms  = MySprite : createMS ( "Icon.png" )
         layerFarm : addChild ( ms )
 
         return layerFarm
     end
 
     -- run
     local sceneGame = CCScene : create ( )
     sceneGame : addChild ( createLayerFarm ( ) )
     CCDirector : sharedDirector ( ) : runWithScene ( sceneGame )
end
 
xpcall ( main , __G__TRACKBACK__ )

运行截图如下:

QQ20130407-6

 

OK,今天就到这,希望大家多多探讨,有问题请及时留言。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tolua是一种用于将C/C++代码绑定到Lua脚本语言的工具。tolua 1.0.93是tolua工具的一个特定版本,并且是已经经过编译的版本。通过编译好的tolua 1.0.93,我们可以方便地在Lua使用C/C++代码,实现更高级的功能或者优化性能。 在使用编译好的tolua 1.0.93时,我们首先需要将tolua的头文件和库文件正确地链接到我们的项目中。然后,我们可以使用tolua的API来定义Lua脚本中可以访问的C/C++函数,并将它们绑定在一起。通过这种方式,我们可以在Lua脚本中调用这些C/C++函数,实现复杂的功能。 tolua 1.0.93编译好的版本带来了一些改进和优化,可能修复了之前版本中的一些bug,提高了性能和稳定性。这使得我们能够更好地利用Lua和C/C++的优势,使二者结合更加方便和高效。 总之,tolua 1.0.93 编译好的版本是一种方便的工具,通过它我们可以将C/C++代码与Lua脚本相结合,从而实现更高级和更复杂的功能。 ### 回答2: "tolua 1.0.93编译好的"是指tolua的一个特定版本,它已经经过编译,可以直接在相应的平台上使用。 tolua是一个开源项目,它允许开发者用C/C++来编写Lua的扩展模块。Lua是一种脚本语言,可嵌入其他应用程序中使用,tolua则为嵌入到C/C++应用程序中的Lua提供了一个简单的扩展方法。 通过编译好的tolua 1.0.93版本,开发者可以在他们的应用程序中直接使用Lua语言以及通过C/C++编写的扩展模块。这样可以在不用对Lua进行大量的C语言绑定操作的前提下,实现对应用程序的灵活扩展。 编译好的版本意味着它已经经过编译器的处理,可以直接在相应的平台上运行,无需再进行编译步骤。这为开发者提供了更为方便的使用方式,可以节省时间和精力。 总之,tolua 1.0.93编译好的版本是一个可以直接在应用程序中使用的已编译版本,它提供了一种简单的方法将Lua与C/C++结合,以实现应用程序的扩展功能。 ### 回答3: tolua 1.0.93 是一个已经编译好的开源工具,用于将C/C++代码转换为Lua脚本。它是一个由多个C语言文件组成,并且已经被编译为可执行文件供用户直接使用使用这个编译好的版本,用户可以方便地将已有的C/C++代码整合到Lua环境中,并且可以使用Lua的一些特性和库对代码进行扩展和增强。tolua 1.0.93提供了一组API,让用户可以在Lua环境中调用C/C++代码,并且可以实现C/C++Lua的双向数据传递。 使用tolua 1.0.93编译好的版本,用户可以享受到编译程序带来的便利,无需进行源代码的编译和配置,只需要将已经编译好的工具集成到项目中即可。同时,这个版本也同时提供了相应的文档和示例,方便用户快速上手和了解如何使用。 总之,tolua 1.0.93 编译好的版本为用户提供了一种快速将C/C++代码与Lua脚本结合的方法,使得开发者可以更加灵活和高效地利用Lua的特性和C/C++强大的计算能力,从而更加方便地开发出功能丰富的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值