步骤一:首先自定义类(这里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
#include
using namespace cocos2d;
class MySprite public CCSprite{
public :
static MySprite* const char *
};
#endif
|
MySprite.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//
//
//
//
//
//
//
#include
MySprite* const char *
MySprite* new MySprite();
if (sp
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
//!
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
}
*/
class CCSprite public CCNode
{
void setDirty( bool bDirty);
bool isDirty( void );
ccV3F_C4B_T2F_Quad void );
CCRect void );
//bool
bool isTextureRectRotated( void );
void setAtlasIndex(unsigned int uAtlasIndex);
unsigned int getAtlasIndex( void );
//void
void setTextureAtlas(CCTextureAtlas
CCTextureAtlas* void );
//void
//CCSpriteBatchNode*
//void
//ccHonorParentTransform
void setBlendFunc(ccBlendFunc
ccBlendFunc void );
CCPoint void );
void ignoreAnchorPointForPosition( bool newValue);
void setFlipX( bool bFlipX);
void setFlipY( bool bFlipY);
bool isFlipX( void );
bool isFlipY( void );
void removeChild(CCNode* bool bCleanUp);
void removeAllChildrenWithCleanup( bool bCleanup);
void reorderChild(CCNode* int zOrder);
void addChild(CCNode*
void addChild(CCNode* int zOrder);
void addChild(CCNode* int zOrder, int tag);
void sortAllChildren();
//void
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
void setVisible( bool bVisible);
void setOpacity(GLubyte
GLubyte void );
void setColor(ccColor3B
ccColor3B void );
void setOpacityModifyRGB( bool bValue);
bool isOpacityModifyRGB( void );
void setTexture(CCTexture2D
CCTexture2D* void );
void updateTransform( void );
//void
void setTextureRect(CCRect
void setTextureRect(CCRect bool rotated,
void setVertexRect(CCRect
//void
void setDisplayFrame(CCSpriteFrame
bool isFrameDisplayed(CCSpriteFrame
CCSpriteFrame* void );
void setBatchNode(CCSpriteBatchNode*
CCSpriteBatchNode*
void setDisplayFrameWithAnimationName( const char *animationName, int frameIndex);
static CCSprite*
static CCSprite*
static CCSprite*
static CCSprite* const char *pszSpriteFrameName);
static CCSprite* const char *pszFileName,
static CCSprite* const char *pszFileName);
static CCSprite*
};
|
没错,我们也会按照类似方式进行创建我们自定义类的pkg文件。
我们自定义一个文件(文本、xcode等都可以),后缀 .pkg ,然后将Himi自定义的MySprite类定义到pkg中,如下:
注意:只要自定义类.h中的内容,至于cpp的实现,binding后lua自动调用你类的函数
MySprite.pkg
1
2
3
|
class MySprite public CCSprite{
static MySprite* const char *
};
|
在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
Build for windows ( build.bat ) and unix ( build.sh ) are
to generate the relevant after modifying the .pkg
scripts run the following :
tolua + + .exe - L - o 2 d.cpp 2 d.pkg
This the bindings file and patch it with come 2 dx
specific
On run "make" to
the bindings
if / when
2. Writing
1 ) enum the same
2 ) remove CC_DLL for the class
, pay to multi
3 ) remove inline for declaration and implementation
4 ) remove public and private
5 ) remove the
of
6 ) keep
7 ) remove memeber that declared as private or protected
|
这个文件声明了书写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 ( "----------------------------------------" )
end
local function main ( )
--
collectgarbage ( "setpause" , 100 )
collectgarbage ( "setstepmul" , 5000 )
local cclog = function ( ... )
print ( string .format ( ... ) )
end
require "hello2"
cclog ( "result
( 3 , 5 ) )
---------------
--
local function ( )
local layerFarm = CCLayer : create ( )
local font =
: create ( "Himi , "Verdana-BoldItalic" , 20 )
font : setPosition ( ccp ( 220 , 260 ) )
layerFarm : addChild ( font )
local ms = MySprite : createMS ( "Icon.png" )
layerFarm : addChild ( ms )
return layerFarm
end
--
local sceneGame = CCScene : create ( )
sceneGame : addChild ( createLayerFarm ( ) )
CCDirector : sharedDirector ( ) : runWithScene ( sceneGame )
end
xpcall ( main , __G__TRACKBACK__ )
|
运行截图如下: