转载请注明,原文地址: http://www.benmutou.com/archives/26
文章来源:笨木头与游戏开发

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

笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址 http://blog.csdn.net/musicvs/article/details/8166655

正文:

 

上回说到,把LuaCocos2d.cpp文件拷到我们的lua工程里,然后,编译。

大功告成……啊才怪啊~!

你会发现一大堆的编译错误,超过100个了,木了个头的。怎么回事,我只能认定是这个工具出问题了。

怎么办?没关系~我们在LuaCocos2d.cpp里搜索一下我们的SpriteFactory类吧,肯定有的,看看其中一段:
[cce_cpp]/* method: sharedSpriteFactory of class  SpriteFactory */
#ifndef TOLUA_DISABLE_tolua_Cocos2d_SpriteFactory_sharedSpriteFactory00
static int tolua_Cocos2d_SpriteFactory_sharedSpriteFactory00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
    tolua_Error tolua_err;
    if (
        !tolua_isusertable(tolua_S,1,"SpriteFactory",0,&tolua_err) ||
        !tolua_isnoobj(tolua_S,2,&tolua_err)
        )
        goto tolua_lerror;
    else
#endif
    {
        {
            SpriteFactory* tolua_ret = (SpriteFactory*)  SpriteFactory::sharedSpriteFactory();
            tolua_pushusertype(tolua_S,(void*)tolua_ret,"SpriteFactory");
        }
    }
    return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'sharedSpriteFactory'.",&tolua_err);
    return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE[/cce_cpp]

知道我想说什么吧?既然它已经能生成自定类的这些代码了,那还怕什么。

现在回到生成LuaCocos2d.cpp的步骤,打开Cocos2d.pkg文件,把其它所有无关的类删除~!变成这样:

[cce_cpp]$#include "LuaCocos2d.h"

$pfile " SpriteFactory.pkg"[/cce_cpp]



然后继续输入命令,生成LuaCocos2d.cpp文件。



于是,这样生成的文件就只有我们自定义类的声明代码了:
[cce_cpp]#include "LuaCocos2d.h"

/* function to register type */ static void tolua_reg_types (lua_State* tolua_S) { #ifndef Mtolua_typeid #define Mtolua_typeid(L,TI,T) #endif tolua_usertype(tolua_S,"CCSprite"); Mtolua_typeid(tolua_S,typeid(CCSprite), "CCSprite"); tolua_usertype(tolua_S,"CCLayer"); Mtolua_typeid(tolua_S,typeid(CCLayer), "CCLayer"); tolua_usertype(tolua_S,"SpriteFactory"); Mtolua_typeid(tolua_S,typeid(SpriteFactory), "SpriteFactory"); }

/* method: sharedSpriteFactory of class SpriteFactory */ #ifndef TOLUA_DISABLE_tolua_Cocos2d_SpriteFactory_sharedSpriteFactory00 static int tolua_Cocos2d_SpriteFactory_sharedSpriteFactory00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1,"SpriteFactory",0,&tolua_err) || !tolua_isnoobj(tolua_S,2,&tolua_err) ) goto tolua_lerror; else #endif { { SpriteFactory* tolua_ret = (SpriteFactory*) SpriteFactory::sharedSpriteFactory(); tolua_pushusertype(tolua_S,(void*)tolua_ret,"SpriteFactory"); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'sharedSpriteFactory'.",&tolua_err); return 0; #endif } #endif //#ifndef TOLUA_DISABLE

/* method: createSprite of class SpriteFactory */ #ifndef TOLUA_DISABLE_tolua_Cocos2d_SpriteFactory_createSprite00 static int tolua_Cocos2d_SpriteFactory_createSprite00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertype(tolua_S,1,"SpriteFactory",0,&tolua_err) || !tolua_isusertype(tolua_S,2,"CCLayer",0,&tolua_err) || !tolua_isnumber(tolua_S,3,0,&tolua_err) || !tolua_isnoobj(tolua_S,4,&tolua_err) ) goto tolua_lerror; else #endif { SpriteFactory* self = (SpriteFactory*) tolua_tousertype(tolua_S,1,0); CCLayer* mLayer = ((CCLayer*) tolua_tousertype(tolua_S,2,0)); SpriteFactory::SpriteType enSpriteType = ((SpriteFactory::SpriteType) (int) tolua_tonumber(tolua_S,3,0)); #ifndef TOLUA_RELEASE if (!self) tolua_error(tolua_S,"invalid 'self' in function 'createSprite'", NULL); #endif { CCSprite* tolua_ret = (CCSprite*) self->createSprite(mLayer,enSpriteType); tolua_pushusertype(tolua_S,(void*)tolua_ret,"CCSprite"); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'createSprite'.",&tolua_err); return 0; #endif } #endif //#ifndef TOLUA_DISABLE

/* Open function */ TOLUA_API int tolua_Cocos2d_open (lua_State* tolua_S) { tolua_open(tolua_S); tolua_reg_types(tolua_S); tolua_module(tolua_S,NULL,0); tolua_beginmodule(tolua_S,NULL); tolua_cclass(tolua_S,"SpriteFactory","SpriteFactory","",NULL); tolua_beginmodule(tolua_S,"SpriteFactory"); tolua_constant(tolua_S,"en_close",SpriteFactory::en_close); tolua_constant(tolua_S,"en_grossini",SpriteFactory::en_grossini); tolua_constant(tolua_S,"en_grossinis_sister",SpriteFactory::en_grossinis_sister); tolua_constant(tolua_S,"en_grossinis_sister2",SpriteFactory::en_grossinis_sister2); tolua_function(tolua_S,"sharedSpriteFactory",tolua_Cocos2d_SpriteFactory_sharedSpriteFactory00); tolua_function(tolua_S,"createSprite",tolua_Cocos2d_SpriteFactory_createSprite00); tolua_endmodule(tolua_S); tolua_endmodule(tolua_S); return 1; }

#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 TOLUA_API int luaopen_Cocos2d (lua_State* tolua_S) { return tolua_Cocos2d_open(tolua_S); }; #endif[/cce_cpp]



这就没有问题了,我们不要替换它原有LuaCocos2d.cpp文件,而是依葫芦画瓢地把我们生成的LuaCocos2d.cpp文件里新增的内容拷到原有的文件里。这样编译就基本不会报错了,即使报错,也只是小范围报错,顶多几个,不会出现上百个错误吓死人了。

 

然后编译,运行,没有问题了。

我写了一个lua文件测试我的功能:
[cce_cpp]local function createLayer()
	local layer = CCLayer:create();

local sprite = SpriteFactory:sharedSpriteFactory():createSprite(layer, SpriteFactory.en_grossini); sprite:setPosition(200, 200); return layer; end

local scene = CCScene:create(); scene:addChild(createLayer()); CCDirector:sharedDirector():replaceScene(scene);[/cce_cpp]

运行效果:

 

 

完美~!噗,自己赞自己。

 
24 条评论
  • 阿宝 2014-01-02 15:55:31

    如果可以最好能出个视频教程? 付费都可以的!感激不尽! 本人急需这方面的材料! 哎,网上很少啊!!
    0回复
  • 阿宝 2014-01-02 15:46:52

    有两个问题:1、在项目proj.win32文件里创建了自定义类SNSprite,如何在LuaCocos2d.h文件中如何导入自定义类,我是这样导入的 #include "SNSprite.h" 但是出错。 2、luacocos2d.cpp(383): error C3861: “Mtolua_typeid”: 找不到标识符 这个错误代表是什么原因呢? 一个星期没搞定了
    0回复
    • 博主 糟糕_树叶的mut 2014-01-03 12:44:56

      关于lua的教程,你可以看看himi的,他还是写了蛮多的~关于lua的,我自己也很少用
      0回复
  • Oo幻想oO 2013-11-21 15:08:06

    发现这网站没有搜索功能的说,为了别到处留言可是找死我了说……你是把所有自己写的cpp文件都写在了Class目录下的吧,所以只需要把这cpp添加到该项目下的Android.mk吧……可是这样子不会造成新项目就不能直接使用旧项目的那些函数了么,因为头文件包含你不是写在Luacocos2d的头文件里面就是cpp文件里面吧?我之前是想将文件放在Luacocos2d同目录下的,可是这样子项目的Android.mk的路径写起来好麻烦……或者要不修改Luacocos2d里面的那个Android.mk……很好奇大大在这方面是如何取舍的
    0回复
    • 博主 糟糕_树叶的mut 2013-11-21 16:08:00

      不太清楚你的描述,我没有用lua开发实际项目,我目前还是用C++直接开发,对目前的我来说,这样开发效率比较高 另外,有搜索功能的,我以后没人会去用,就关了= =那我就开回来吧~
      0回复
      • Oo幻想oO 2013-11-21 16:42:09

        居然不用Lua,可恨……赶紧把搜索开回来的说,找死人的说……D:Cocos2d-Xcocos2d-x-2.2.0externalsqlite3有没有用过这玩意啊?C++没什么经验,大概是包含头文件,添加依赖项这样子来使用么,然后dll就会自己复制到debug目录下的么?老大没有添加依赖项,所以dll要自己复制到debug下,这样子好讨厌……移植到Android下有没有什么问题啊?嘿嘿,问题太多了啦
        0回复
        • 博主 糟糕_树叶的mut 2013-11-21 17:18:28

          问题多没关系,反正sqlite3我也没用过,我主要写网游的,客户端果断不需要数据库 其实我也比较喜欢直接复制到debug下,那就复制一下吧,然后在项目属性里添加一下链接库配置~移植和这个配置没啥关系~最后,搜索已经开回来了,在右上角~
          0回复
          • Oo幻想oO 2013-11-21 17:29:42

            移植没关系就好了,老大没有测试过就丢到项目中去,我多害怕有问题……我现在做得就是网游的说……链接库没有添加哎,老大把lib和h都拉进项目里面了……不过该楼已经歪了 哈哈
            0回复
            • 博主 糟糕_树叶的mut 2013-11-21 17:39:51

              网游客户端还搞数据库?看来你们的游戏挺大的~
              0回复
              • Oo幻想oO 2013-11-21 17:48:27

                只有两个从0开始的实习生做,能有多大……嘛嘛,卡牌比较多嘛……不小心剧透了说(没看到,没看到)
                0回复
                • 博主 糟糕_树叶的mut 2013-11-21 20:42:12

                  貌似我所听到做手机网游的全都都是做卡牌或者coc...你已经是..应该至少是第5个了
                  0回复
                  • Oo幻想oO 2013-11-21 20:47:28

                    没事,我们这个绝对有其他人没有的,虽然我觉得做出来不会有人玩就是了……话说你说和移植没有关系,那么为什么curl编译的时候又需要用到libcurl呢,这我就觉得奇怪了啦……不知道你有没有用过AssetsManager呢
                    0回复
  • thbourlove 2012-11-15 14:26:00

    那个目录下面不是有个脚本的嘛。build.php
    0回复
  • musicvs 2012-11-16 09:48:00

    [reply]thbourlove[/reply]
    谢谢提醒~
    0回复
  • alphaJH 2012-12-12 18:45:00

    tolua++/目录下得build.php脚本是干什么的?
    0回复
  • musicvs 2012-12-12 19:49:00

    [reply]alphaJH[/reply]
    说实话...我也不知道(脸红~)
    0回复
  • wowo5050 2013-02-05 11:17:00

    写的很精彩,学习了
    0回复
  • musicvs 2013-02-05 22:23:00

    [reply]wowo5050[/reply]
    谢谢,嘿嘿~
    0回复
  • wengxianxun 2013-02-22 09:02:00

    可以共享一个代码吗, wengxianxun@hotmail.com
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发