[✔️]lua中的function,在c++进行callback

简介: [✔️]lua中的function,在c++进行callback

在lua中我们这么注册touch事件


local listenner = cc.EventListenerTouchOneByOne:create()
listenner:registerScriptHandler(function(touch, event)
        return true;
end, cc.Handler.EVENT_TOUCH_BEGAN)


在c++里面


typedef std::function<bool(Touch*, Event*)> ccTouchBeganCallback;
ccTouchBeganCallback onTouchBegan;
auto lis = EventListenerTouchOneByOne::create();
lis->onTouchBegan = CC_CALLBACK_2(TestLayer::touchBegan, this);


很明显onTouchBegin是一个std::function,如果在c++中,如果我们的参数是一个function,那么生成的lua binding代码中会有这么一段逻辑:


std::function<void ()> arg0;
do {
        // Lambda binding for lua is not supported.
        assert(false);
} while(0)
;


很明显,这里主动报错了,注释中也说明了,function在lua中是不支持的


 void scheduleOnce(const std::function<void(float)>& callback, float delay, const std::string &key);


static EventListenerCustom* create(const std::string& eventName, const std::function<void(EventCustom*)>& callback);


EventCustom


在lua中创建自定义事件:


local lis = cc.EventListenerCustom:create("APP_EVENT", function (){
    log("EVENT")
});
cc.Director:getInstance():getEventDispatcher():addEventListenerWithFixedPriority(lis, 1)


cc.EventListenerCustom:create对应的c++ lua binding代码:


const std::string eventName = ((const std::string)  tolua_tocppstring(tolua_S,2,0));
LUA_FUNCTION handler = toluafix_ref_function(tolua_S,3,0);
cocos2d::EventListenerCustom* tolua_ret = LuaEventListenerCustom::create(eventName);
// 你会发现最终其实它也是到了ScriptHandlerMgr.addObjectHandler,会将lua function存储在map表
ScriptHandlerMgr::getInstance()->addObjectHandler((void*)tolua_ret, handler, ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM);


在tolua工具模板代码中并没有出现以上的c++片段,那么就是后期人为修正的一段逻辑

lua中触发


local event = cc.EventCustom:new("APP_EVENT")
event.data="12";
cc.Director:getInstance():getEventDispatcher():dispatchEvent(event)


void EventDispatcher::dispatchEvent(Event* event){
    auto iter = _listenerMap.find(listenerID);
    if (iter != _listenerMap.end())
    {
        auto listeners = iter->second;
        auto onEvent = [&event](EventListener* listener) -> bool{
            event->setCurrentTarget(listener->getAssociatedNode());
            listener->_onEvent(event); // 响应触发事件,对于custom
            return event->isStopped();
        };
        (this->*pfnDispatchEventToListeners)(listeners, onEvent);
    }
} 
bool EventListenerCustom::init(const ListenerID& listenerId, const std::function<void(EventCustom*)>& callback)
{
    bool ret = false;
    _onCustomEvent = callback;
    auto listener = [this](Event* event){
        if (_onCustomEvent != nullptr)
        {
            // 所以事件会派发到这里,lambda套娃,真实的函数实体在callback参数
            _onCustomEvent(static_cast<EventCustom*>(event));
        }
    };
    // 第三个参数就是一个lambda,对应的是listener->_onEvent
    if (EventListener::init(EventListener::Type::CUSTOM, listenerId, listener))
    {
        ret = true;
    }
    return ret;
}
// lua_cocos2dx_manual.cpp
EventListenerCustom* LuaEventListenerCustom::create(const std::string& eventName)
{
    EventListenerCustom* eventCustom = new (std::nothrow) EventListenerCustom();
    if (nullptr == eventCustom)
        return nullptr;
    //                                callback参数
    if ( eventCustom->init(eventName, [=](EventCustom* event){
        // 最终是到达了这里
        BasicScriptData data((void*)eventCustom,(void*)event);
        LuaEngine::getInstance()->handleEvent(ScriptHandlerMgr::HandlerType::EVENT_CUSTIOM, (void*)&data );
    }))
    {
        eventCustom->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(eventCustom);
    }
    return eventCustom;
}
// 最后完成到lua层的调用,里面会有对参数的转换
int LuaEngine::handleEvenCustom(void* data){
}
目录
相关文章
|
7月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
113 5
|
3月前
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
63 9
|
2月前
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
89 1
|
4月前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
|
5月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
56 6
|
5月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
7月前
|
程序员 编译器 C++
C++中的函数重载(Function Overloading)
C++中的函数重载(Function Overloading)
84 2
|
7月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
68 2
|
7月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
53 1
|
7月前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
102 1

热门文章

最新文章