ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Cocos2dLua3.17.2集成FairyGUI之 lua绑定 getGroup() 调用问题(三)

2020-01-16 17:55:58  阅读:386  来源: 互联网

标签:Cocos2dLua3.17 cocos2dx obj FairyGUI lua fairygui GObject tolua


在用cocosLua 翻写 fairyGUIdemo的C++版本的代码时,发现在写到obj->getGroup()->name 的时候,运行找不到名字;

demo中的C++代码为

    int cnt = _view->numChildren();
    for (int i = 0; i < cnt; i++)
    {
        GObject* obj = _view->getChildAt(i);
        if (obj->getGroup() != nullptr && obj->getGroup()->name.compare("btns") == 0)
            obj->addClickListener(CC_CALLBACK_1(BasicsScene::runDemo, this));
    }

翻写的代码为

    local cnt = _view:numChildren()
    for i = 1, cnt do
        local obj = _view:getChildAt(i - 1)
        if (obj:getGroup() ~= nil and obj:getGroup().name == "btns") then
            obj:addClickListener(handler(self, self.runDemo))
        end
        --end
    end

打印的obj:getGroup().name 始终为nil。于是去修改源码,在libfairygui工程中GObject.h文件添加两行代码,就是为了把name和id作为函数导出,以便在lua中能被获取到。(id我顺手导出,如果你不用,可以不用导出)

    std::string getName() const { return name; };
    std::string getId() const { return id; };

然后打开lua_cocos2dx_fairygui_auto.cpp文件(上一章中导出的文件,可以去看),添加

int lua_cocos2dx_fairygui_GObject_getName(lua_State* tolua_S)
{
    int argc = 0;
    fairygui::GObject* cobj = nullptr;
    bool ok = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif


#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertype(tolua_S, 1, "fgui.GObject", 0, &tolua_err)) goto tolua_lerror;
#endif

    cobj = (fairygui::GObject*)tolua_tousertype(tolua_S, 1, 0);

#if COCOS2D_DEBUG >= 1
    if (!cobj)
    {
        tolua_error(tolua_S, "invalid 'cobj' in function 'lua_cocos2dx_fairygui_GObject_getName'", nullptr);
        return 0;
    }
#endif

    argc = lua_gettop(tolua_S) - 1;
    if (argc == 0)
    {
        if (!ok)
        {
            tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_fairygui_GObject_getName'", nullptr);
            return 0;
        }
        std::string ret = cobj->getName();
        lua_pushlstring(tolua_S, ret.c_str(), ret.length());
        return 1;
    }
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "fgui.GObject:getName", argc, 0);
    return 0;

#if COCOS2D_DEBUG >= 1
    tolua_lerror:
                tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_fairygui_GObject_getName'.", &tolua_err);
#endif

                return 0;
}

int lua_cocos2dx_fairygui_GObject_getId(lua_State* tolua_S)
{
    int argc = 0;
    fairygui::GObject* cobj = nullptr;
    bool ok = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif


#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertype(tolua_S, 1, "fgui.GObject", 0, &tolua_err)) goto tolua_lerror;
#endif

    cobj = (fairygui::GObject*)tolua_tousertype(tolua_S, 1, 0);

#if COCOS2D_DEBUG >= 1
    if (!cobj)
    {
        tolua_error(tolua_S, "invalid 'cobj' in function 'lua_cocos2dx_fairygui_GObject_getId'", nullptr);
        return 0;
    }
#endif

    argc = lua_gettop(tolua_S) - 1;
    if (argc == 0)
    {
        if (!ok)
        {
            tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_fairygui_GObject_getId'", nullptr);
            return 0;
        }
        std::string ret = cobj->getId();
        lua_pushlstring(tolua_S, ret.c_str(), ret.length());
        return 1;
    }
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "fgui.GObject:getId", argc, 0);
    return 0;

#if COCOS2D_DEBUG >= 1
    tolua_lerror:
                tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_fairygui_GObject_getId'.", &tolua_err);
#endif

                return 0;
}

并导出两个函数,找到int lua_register_cocos2dx_fairygui_GObject(lua_State* tolua_S) 函数在里面写入

int lua_register_cocos2dx_fairygui_GObject(lua_State* tolua_S)
{
...
...

tolua_function(tolua_S, "getName", lua_cocos2dx_fairygui_GObject_getName);
tolua_function(tolua_S, "getId", lua_cocos2dx_fairygui_GObject_getId);

....
}

至此 已完成导出

下面开始修改lua代码调用

    local cnt = _view:numChildren()
    print("cnt:", cnt)
    for i = 1, cnt do
        local obj = _view:getChildAt(i - 1)
        if (obj:getGroup() ~= nil and obj:getGroup():getName() == "btns") then
            print("name==>::", obj:getGroup():getName())
            obj:addClickListener(handler(self, self.runDemo))
        end
        --end
    end

 

编译,运行

 

 完成!

 

标签:Cocos2dLua3.17,cocos2dx,obj,FairyGUI,lua,fairygui,GObject,tolua
来源: https://www.cnblogs.com/whj0402/p/12202511.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有