zoukankan      html  css  js  c++  java
  • Cocos2dLua3.17.2集成FairyGUI之 lua绑定 getGroup() 调用问题(三)

    在用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 
    ", "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 
    ", "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

    编译,运行

     完成!

  • 相关阅读:
    03-架构设计的目的
    02-架构设计的历史背景
    01-架构到底是指什么
    python 基础 1.5 python数据类型(四)--字典
    python 基础 1.5 python数据类型(三)--元组常用方法示例
    python 基础 1.5 python数据类型(三)--元组
    python 基础 1.5 python数据类型(二)--列表常用方法示例
    python 基础 1.5 数据类型(二)--列表
    python 基础 1.5 python 数据类型(一)--整型 浮点型 布尔型及字符串和常用方法
    python 基础 1.4 python运算符
  • 原文地址:https://www.cnblogs.com/whj0402/p/12202511.html
Copyright © 2011-2022 走看看