事件分发

通常会遇到这样的需求,例如 玩家升级 引起 增加血量、开启新的功能、分配新任务,等类似一对多的触发逻辑。那么我们可以创建一个 upLevel = Event:New() 事件,在玩家升级的时候触发该事件 upLevel:call(),如果我们已在功能系统、任务系统中增加的玩家升级的事件的关联方法,那么当玩家升级时会触发关联的方法。

local Event = {}
Event.__index = Event
Event.__call = function(t, ... )
    for k,v in pairs(t.events) do
        pcall(v, ...)
    end
end

function Event.New(cls)
    local self = setmetatable({},cls)
    self.events = {}
    return self
end

function Event:add(func)
    if func then
        self.events[func] = func
    end
end

function Event:remove(func)
    if func then
        self.events[func] = nil
    end
end

function Event:clear()
    self.events = {}
end

function Event:call( ... )
    for k,v in pairs(self.events) do
        pcall(v, ...)
    end
end

function test()
    local f1 = function( ... )
        print("call f1>>", ...)
    end
    local f2 = function( ... )
        print("call f2>>", ...)
    end
    local e = Event:New()
    e:add(f1)
    e:add(f2)
    e()
end

return Event

使用
通常使用 add 和 call 就够了。创建一个挂在玩家身上的事件,用于表示升级这个触发系统。

role.upLevel = Event:New()
-- 监听
role.upLevel:add(task.onUpLevel)
role.upLevel:add(open.onUpLevel)
-- 玩家升级的时候触发
role.upLevel()

你可能感兴趣的:(事件分发)