使用tolua++編譯pkg,從而建立自定義類讓Lua腳本使用


步驟一:首先自定義類(這裏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++的工具,以下圖:

 

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++工具 或者終端輸入 ./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__ )  

運行截圖以下:

QQ20130407-6

原文連接: http://www.himigame.com/lua-game/1259.html 

相關文章
相關標籤/搜索