【木头Cocos2d-x 007】在Lua中使用自定义类——tolua++工具使用(上集)

前端之家收集整理的这篇文章主要介绍了【木头Cocos2d-x 007】在Lua中使用自定义类——tolua++工具使用(上集)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

【木头Cocos2d-x 007】在Lua中使用自定义类——tolua++工具使用(上集)

分类笨木头 Cocos2D-x 11861人阅读 评论(21) 收藏 举报

在@H_502_24@Lua中使用自定义类——@H_502_24@tolua++工具使用(上集)

@H_502_24@笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址http://www.jb51.cc/article/p-pknidkgr-zw.html

正文:

最近看了一下@H_502_24@TestLua的例子,挺有意思的,使用@H_502_24@Lua对网游开发来说,很实用。我目前这个项目没有使用@H_502_24@Lua等脚本,已经吃尽苦头了,每次客户端更新就流失好多玩家。虽然我的项目没有用@H_502_24@cocos2d-x开发,但是因为最近在研究它,所以就好奇一下@H_502_24@lua和@H_502_24@cocos2d-x的整合。

百度没有多少资料,最实在的一篇教程应该就是@H_502_24@Himi那篇了(高手一只,不解释)。所以只能靠自己了。

怎么运行@H_502_24@Lua例子,以及在@H_502_24@cocos2d-x里使用@H_502_24@Lua的简单规则,请看之前我写的那篇教程,以及更加详细的@H_502_24@Himi的教程(http://www.himigame.com/iphone-cocos2dx/681.html)。

这里我主要是想分享一下如何在@H_502_24@lua中使用自己的类,其实@H_502_24@cocos2d-x已经提供工具,并且封装好了@H_502_24@c++整合@H_502_24@lua。

好,废话说多了,开始@H_502_24@~!

@H_502_24@

@H_502_24@1.只关注@H_502_24@LuaCocos2d.cpp文件

假设看这篇文章的朋友已经了解了@H_502_24@LuaCocos2d.cpp的大概作用(不了解的,可以看看上面推荐的那篇@H_502_24@Himi的文章),我们知道,要在@H_502_24@lua使用@H_502_24@cocos2d-x里的类,就首先要在@H_502_24@LuaCocos2d.cpp里@H_502_24@“声明@H_502_24@”,此声明非彼声明哈,但是比较贴切。反正就是要在这个@H_502_24@LuaCocos2d.cpp里做文章就是了。虽然这个@H_502_24@cpp文件很庞大,但是都是一些重复的东西,形如:

  1. tolua_cclass(tolua_S,"CCActionEase","CCActionInterval",NULL);
  2. tolua_beginmodule(tolua_S,"CCActionEase");
  3. tolua_function(tolua_S,"copyWithZone",tolua_Cocos2d_CCActionEase_copyWithZone00);
  4. tolua_function(tolua_S,"reverse",tolua_Cocos2d_CCActionEase_reverse00);
  5. "create",tolua_Cocos2d_CCActionEase_create00);
  6. tolua_endmodule(tolua_S);

这些操作就像是在向程序注册我们的类,让这些类可以在@H_502_24@lua中使用。

@H_502_24@

@H_502_24@2.真正想知道的事情是,除了@H_502_24@cocos2d-x的类,我们可以在@H_502_24@lua中使用自己的类吗?

当然可以了,就算不是在@H_502_24@cocos2d-x引擎里,本身@H_502_24@lua就可以在@H_502_24@c++中互相调用的(当然,@H_502_24@Java也可以)。只是,既然@H_502_24@cocos2d-x帮我们封装好了,我们就用它提供的方法来使用@H_502_24@lua吧。

首先,我第一时间会想到,在@H_502_24@LuaCocos2d.cpp中依葫芦画瓢,把自己的类加进去就好了。当然,我也是这么想的,但是在添加的过程中碰了钉子,很多规则不太清楚,总是有些错误。后来。。。

@H_502_24@

@H_502_24@3.@H_502_24@tolua++.exe工具

后来我发现了@H_502_24@cocos2d-x竟然提供了这个工具,这是十分难发现的,隐藏得很深的,没有任何提示的,我竟然能发现它,噗。

我才不会告诉你们@H_502_24@LuaCocos2d.cpp文件的顶部有注释,并且注释已经告诉我们有这个工具的)

?
    /*
  1. **Luabinding:Cocos2d
  2. **Generatedautomaticallybytolua++-1.0.92on08/30/1212:11:53.
  3. */


工具在这个路径下:@H_502_24@cocos2d-2.0-x-2.0.2\tools\tolua++,有@H_502_24@windows版本的,和@H_502_24@mac版本的。

这个工具可以帮我们生成自定义类的@H_502_24@“声明@H_502_24@”代码。怎么使用?该目录下有个@H_502_24@README文件,我用我那蹩脚的英语水平看懂了@H_502_24@80%,并且加上了蹩脚的中文注释,希望不要介意:

@H_502_24@1.Generating the lua<-->C bindings with tolua++

@H_502_24@//使用此命令生成@H_502_24@LuaCocos2d.cpp文件

@H_502_24@tolua++.exe -tCocos2d -o LuaCocos2d.cpp Cocos2d.pkg

@H_502_24@An ant script has been provided to generate the relevant files,to do this after

@H_502_24@modifying the .pkg files you should use the following command in this directory:

@H_502_24@ant

@H_502_24@This will generate the bindings file,patch it to compile successfully and move it

@H_502_24@to the standard destination.

@H_502_24@

@H_502_24@2. Writing .pkg files//为要在@H_502_24@lua使用的类编写@H_502_24@pkg文件

@H_502_24@1) enum keeps the same //枚举类型保留不变

@H_502_24@2) remove CC_DLL for the class defines,pay attention to multi inherites //不要使用@H_502_24@CC_DLL,改用多继承

@H_502_24@3) remove inline keyword for declaration and implementation //删除内置变量?

@H_502_24@4) remove public protect and private //不要用访问限定词

@H_502_24@5) remove the decalration of class member variable //不要成员变量

@H_502_24@6) keep static keyword //保留静态关键词

@H_502_24@7) remove memeber functions that declared as private or protected //@H_502_24@public函数删除

@H_502_24@

也许有点混乱,来看看该目录下的这个文件:@H_502_24@Cocos2d.pkg

@H_531_502@

@H_502_24@$#include "LuaCocos2d.h"

@H_502_24@$pfile "CCAction.pkg"

@H_502_24@$pfile "CCActionCamera.pkg"

@H_502_24@$pfile "CCActionCatmullRom.pkg"

@H_502_24@$pfile "CCActionEase.pkg"

@H_502_24@$pfile "CCActionGrid.pkg"

@H_502_24@$pfile "CCActionGrid3D.pkg"

@H_502_24@$pfile "CCActionManager.pkg"

其实这些就是@H_502_24@cocos2d-x的一些,这些类放在这里,是为了自动生成@H_502_24@LuaCocos2d.cpp文件,这样,在@H_502_24@lua中就可以使用这些类了。

那么,我们同样可以把自定义的类放到这里来。

当然,必须按照规则来编写@H_502_24@pkg文件

别着急,一步步来@H_502_24@…

@H_502_24@

@H_502_24@4.编写@H_502_24@pkg文件

@H_502_24@a.首先我写了一个自定义的类,这个类很简单,用来生成精灵的工厂类:

?
    /************************************************************************/
  1. /*精灵工厂*/
  2. /*使用了简单工厂,但,不是工厂模式*/
  3. /************************************************************************/
  4. #ifndef__SPRITE_FACTORY_H__
  5. #define__SPRITE_FACTORY_H__
  6. #include"cocos2d.h"
  7. usingnamespacecocos2d;
  8. classSpriteFactory
  9. {
  10. public:
  11. enumSpriteType
  12. {
  13. en_close,
  14. en_grossini,
  15. en_grossinis_sister,85); line-height:18px"> en_grossinis_sister2,226); color:inherit; line-height:18px"> };
  16. staticSpriteFactory*sharedSpriteFactory();
  17. CCSprite*createSprite(CCLayer*mLayer,SpriteTypeenSpriteType);
  18. private:
  19. staticSpriteFactory*mFactory;
  20. };
  21. #endif


@H_502_24@b.然后,开始编写@H_502_24@pkg文件,还记得@H_502_24@README里的规则吗?再看一次:

@H_502_24@1) enum keeps the same //7) remove memeber functions that declared as private or protected//函数

@H_502_24@

根据这个规则,我要把@H_502_24@public和@H_502_24@private关键字去掉,还要把所有成员变量去掉,当然,多余的什么@H_502_24@include、@H_502_24@using namespace都不要了,对了,枚举类型要保留。

于是,最后的@H_502_24@pkg文件如下:

?
    classSpriteFactory
  1. enumSpriteType
  2. en_close,226); color:inherit; line-height:18px"> en_grossini,85); line-height:18px"> en_grossinis_sister,226); color:inherit; line-height:18px"> en_grossinis_sister2,85); line-height:18px"> staticSpriteFactory*sharedSpriteFactory();
  3. CCSprite*createSprite(CCLayer*mLayer,SpriteTypeenSpriteType);
  4. };


好简洁,我喜欢。

@H_502_24@ OK,现在来试试生成@H_502_24@LuaCocos2d.cpp文件吧,打开@H_502_24@cmd,进入@H_502_24@tolua++.exe工具的目录,把我们的@H_502_24@SpriteFactory.pkg文件也拷到这个目录,啊@H_502_24@~!对了!要在@H_502_24@Cocos2d.pkg里加上@H_502_24@SpriteFactory.pkg文件

@H_502_24@$pfile " SpriteFactory.pkg"

@H_502_24@然后,在@H_502_24@cmd里输入命令,开始生成@H_502_24@LuaCocos2d.cpp文件@H_502_24@~

@H_502_24@OK,没有意外的话,@H_502_24@LuaCocos2d.cpp已经在当前目录下了,把它拷到你的@H_502_24@lua工程里,替换掉原来的@H_502_24@LuaCocos2d.cpp文件,然后,编译@H_502_24@~!

大功告成@H_502_24@……才怪啊@H_502_24@~

猜你在找的Cocos2d-x相关文章