注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

【COCOS2DX-LUA脚本开发之三】使用tolua++编译pkg,从而创建自定义类让Lua脚本使用  

2014-08-19 20:28:46|  分类: ios游戏开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

前面我么介绍了【Cocos2dx-Lua 脚本开发之二】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 LuaCocos2d.cpp Cocos2d.pkg
    This will generate the bindings file and patch it with come cocos2dx
    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

转自:http://www.cgzhw.com/?p=262

  评论这张
 
阅读(61)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017