【COCOS2DX-LUA 脚本开发之四】使用TOLUA++编译PKG,从而创建自定义类让LUA脚本使用

本站文章均为 李华明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 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

 

这个文件声明了书写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++工具。

(如果这里终端不能正常执行, 请继续修改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__)

运行截图如下:

 

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

时间: 2024-08-24 11:37:33

【COCOS2DX-LUA 脚本开发之四】使用TOLUA++编译PKG,从而创建自定义类让LUA脚本使用的相关文章

java-Java开发中会在什么情况下创建实体类

问题描述 Java开发中会在什么情况下创建实体类 在Java学习中,大多只提到如何创建实体类,而没有说明在什么情况下要创建实体类. 如果,我读取一个表就要创建一个实体类,过程是不是会有些繁琐了. 解决方案 创建实体类.能花多长时间, 你可以用一些工具.插件,反向生成java类,hibernate有,mybatis也有.很方便的. 解决方案二: 不会很繁琐,就是看你用的什么框架,根据框架的要求创建实体类,一般来说就是写一个class类,没有什么繁琐的 解决方案三: Java有自己的垃圾回收机制,可

dos 编译java 自己创建的类找不到?怎么解?

问题描述 dos 编译java 自己创建的类找不到?怎么解? 路径:com.test:一类:package com.web; class Function{ public int add(int aint b){ return a+b; }}二类:package com.web;import com.web.Function;class Fun{ public int reduce(int aint b){ Function f = new Function(); return f.add(ab

《Unity着色器和屏幕特效开发秘笈》—— 1.5 创建自定义漫反射光照模型

1.5 创建自定义漫反射光照模型 Unity自带的光照函数已经很强大了,不过你需要的不仅仅是这些,你可能希望学到更多并且想要创建大量的自定义光照模型.从实际的经验来看,我们永远不会认为一个只使用自带光照模型的项目是个好项目.我们希望创建自定义光照模型来实现各种效果,比如实现边缘高亮的效果,或者实现更多基于立方贴图的光照,甚至你还想控制你的着色器对游戏过程进行反馈(它可以将所有它能控制的领域反馈给你).本节将着重介绍如何创建自定义光照模型,并使用它创建出各种各样的效果. 1.5.1 如何操作 使用

【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1388.html 唉,首先说点闲话 – -.Himi搞了不短的时间,这个问题一直没有解决,最后终于在张大(cocos2dx引擎开发者之一 张小明)的指导下解决了此问题. 本章基于上一篇  [COCOS2DX-LUA 脚本开发之十三]  与之前的项目整合 [Cocos2d-X(2.x) 游戏开发系列之二]cocos2dx最新

【COCOS2DX-LUA 脚本开发之十三】解决COCOS2DX-LUA编译到ANDROID找不到CCLUAENGINE、HELLOWORLD或出现GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1368.html 对于跨平台整合,Himi已经写了1.x 与 2.x 的了,还不知道如何整合的请移步到 [Cocos2d-X(2.x) 游戏开发系列之二]cocos2dx最新2.x版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!) 本篇只是解决在整合cocos2dx-lua项目会

【COCOS2DX-LUA 脚本开发之一】LUA语言基础在COCOS2DX游戏中使用LUA脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/681.html 对于游戏公司而言,采用游戏脚本lua.python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法: Lua和python这些详细介绍的话,请不太熟悉的童鞋自行百度百科哈,那么对于lua和python则是两个常用的脚本语言,

【COCOS2DX-LUA 脚本开发之八】使用QUICK-COCOS2D-X或COCOS2DX-LUAPROXY的LUA框架实现LUA-HTTP网络交互!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1314.html      利用 cocos2dx-LuaProxy 也可以来实现lua版http功能,具体请移步到:[COCOS2DX-LUA 脚本开发之九]使用cocos2dx-LuaProxy便捷Lua项目快速使用cocos2dx引擎extensions扩展包   Cocos2dx 为我们封装了在cocos2dx中h

【COCOS2DX-LUA 脚本开发之十一】C/C++与LUA之间进行数据函数交互以及解决“PANIC: UNPROTECTED ERROR IN CALL TO LUA API (ATTEMPT TO INDEX A NIL VALUE)”的问题

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1343.html 在使用Cocos2d-x 时候,难免需要C/C++调用Lua函数.数据或Lua调用C/C++函数,那么本篇讲详细介绍C/C++与Lua之间的数据.函数交互. 首先让我们来简单了解几个Lua API函数: int   luaL_dofile (lua_State *L, const char *filena

【COCOS2DX-LUA 脚本开发之十二】HYBRID模式-利用ASSETSMANAGER实现在线更新脚本文件LUA、JS、图片等资源(免去平台审核周期)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的