步驟一:首先自定義類(這裏Himi自定義類名 「MySprite」)html
MySprite.hwindows
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.cppxcode
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中ide
首先咱們到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中,以下:ui
注意:只要自定義類.h中的內容,至於cpp的實現,binding後lua自動調用你類的函數lua
MySprite.pkgspa
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++的工具,以下圖:
解壓出工具以後,咱們還要在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
|
-- 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__
)
|
運行截圖以下: