博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua实现事件派发器(转)
阅读量:4566 次
发布时间:2019-06-08

本文共 3255 字,大约阅读时间需要 10 分钟。

转自:http://www.cppblog.com/sunicdavy/archive/2013/04/24/199692.html?opt=admin

之前想把在unity用c#实现的事件系统转到lua上实现,一搜,果然也有人实现了,那就直接拿来用了,也谢谢上面这篇博主的分享。

local Global = _Glocal package = _G.packagelocal setmetatable = _G.setmetatablelocal assert = _G.assertlocal table = _G.tablelocal pairs = _G.pairslocal ipairs = _G.ipairsmodule "EventDispatcher"--[[数据层次[EventName1] ={    [_StaticFunc] = { Func1, Func2 },    [Object1] = { Func1, Func2 },    [Object2] = { Func1, Func2 },},[EventName2] ={    ...}]]-- 默认调用函数local function PreInvoke( EventName, Func, Object, UserData, ... )    if Object then        Func( Object, EventName, ... )    else        Func( EventName, ... )    endendfunction New( )    local NewObj = setmetatable( {}, { __index = package.loaded["EventDispatcher"] } )    -- 对象成员初始化    NewObj.mPreInvokeFunc = PreInvoke    NewObj.mEventTable = {}    return NewObjend-- 添加function Add( Self, EventName, Func, Object, UserData )    assert( Func )     Self.mEventTable[ EventName ] = Self.mEventTable[ EventName ] or {}    local Event = Self.mEventTable[ EventName ]    if not Object then        Object = "_StaticFunc"    end    Event[Object] = Event[Object] or {}    local ObjectEvent = Event[Object]    ObjectEvent[Func] = UserData or trueend-- 设置调用前回调function SetDispatchHook( Self, HookFunc )    Self.mPreInvokeFunc = HookFuncend-- 派发function Dispatch( Self, EventName, ... )    assert( EventName )    local Event = Self.mEventTable[ EventName ]    for Object,ObjectFunc in pairs( Event ) do        if Object == "_StaticFunc" then            for Func, UserData in pairs( ObjectFunc ) do                Self.mPreInvokeFunc( EventName, Func, nil, UserData, ... )            end        else            for Func, UserData in pairs( ObjectFunc ) do                Self.mPreInvokeFunc( EventName, Func, Object, UserData, ... )            end        end    endend-- 回调是否存在function Exist( Self, EventName )    assert( EventName )    local Event = Self.mEventTable[ EventName ]    if not Event then        return false    end    -- 需要遍历下map, 可能有事件名存在, 但是没有任何回调的    for Object,ObjectFunc in pairs( Event ) do        for Func, _ in pairs( ObjectFunc ) do            -- 居然有一个            return true        end    end    return falseend-- 清除function Remove( Self, EventName, Func, Object )    assert( Func )    local Event = Self.mEventTable[ EventName ]    if not Event then        return    end    if not Object then        Object = "_StaticFunc"    end    local ObjectEvent = Event[Object]    if not ObjectEvent then        return    end    ObjectEvent[Func] = nilend-- 清除对象的所有回调function RemoveObjectAllFunc( Self, EventName, Object )    assert( Object )    local Event = Self.mEventTable[ EventName ]    if not Event then        return    end    Event[Object] = nilend

用例:

1 local EventDispatcher = require 'EventDispatcher' 2   3 local E = EventDispatcher.New() 4   5   6 E:Add( "a", function( a, b )   print( a, b ) end ) 7   8 local Func = function( a )   print( a ) end  9 E:Add( "a", Func )10  11  12 E:Dispatch("a", 1, 2 )13 print( E:Exist("a"), E:Exist("b"))14  15 E:Remove("a", Func )16  17 E:Dispatch("a", 1, 2 )18 print( E:Exist("a"), E:Exist("b"))

结语:发现lua真的很好用,用得好也很强大,将c#的东西用lua实现一遍的时候发现代码量少了很多。

转载于:https://www.cnblogs.com/SeaSwallow/p/7118712.html

你可能感兴趣的文章
2015年3月5日(元宵节)——substr()与substring()的区别
查看>>
mysql 导出查询结果到文件
查看>>
Js参数值中含有单引号或双引号解决办法
查看>>
python5
查看>>
js转换/Date(........)/
查看>>
mysql中limit用法
查看>>
C#开源爬虫NCrawler源代码解读以及将其移植到python3.2(1)
查看>>
c++ std::thread + lambda 实现计时器
查看>>
NSRunLoop个人理解
查看>>
BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)
查看>>
[osg]osg窗口显示和单屏幕显示
查看>>
前端技术在线文档地址链接
查看>>
077_打印各种时间格式
查看>>
[LeetCode] 101. Symmetric Tree_ Easy tag: BFS
查看>>
前端基础之html
查看>>
.Net基础之3——运算符
查看>>
scrapy管道MySQL简记
查看>>
使用 jQuery Deferred 和 Promise 创建响应式应用程序
查看>>
Bzoj1013--Jsoi2008球形空间产生器
查看>>
报文格式【定长报文】
查看>>