通常会遇到这样的需求,例如 玩家升级 引起 增加血量、开启新的功能、分配新任务,等类似一对多的触发逻辑。那么我们可以创建一个 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()
网友评论