监听器,从字面上看是用来监听的,在程序上起到的作用事实上也是如此。
比如:在游戏王者荣耀中,每一波小兵出现的时间、小龙第一次出现的时间、第一波野怪出现的时间都是固定的,即时间一到立即出现。除此之外,一波野怪全部死去到下一波相同位置野怪再次出现的时间间隔也是固定的。我们可以用监听器通过监听时间,到点自动触发方法来重新生成对应的野怪或者大龙。
建一个lua文件eventDispatch.lua(可以看成一个java类)
类中方法说明:
- addEventListener(event,listener):添加监听器
- dispatchEvent(event,data):执行监听器
- removeEventListener(event,listener):移除某个监听器
- hasEventHandler(event,listener):判断有没有某个监听器
- clear() :清除监听器
eventDispatcher=
{
eventTb={} --初始化eventTb,将其赋值为一个空表,这样可以防止eventTb为nil。
}
-- event: 被监听的事件,其名字可以自己取,比如要给刷野怪执行监听,名字就叫“legendaryRefresh”
-- listener:被监听者(需要监听的具体方法)
function eventDispatcher:addEventListener(event,listener)
print("add event listener:",event,listener)
if(listener==nil)then
do return end
end
if(self.eventTb[event]==nil)then
self.eventTb[event]={}
end
local flag=false
for k,v in pairs(self.eventTb[event]) do
if(v==listener)then
flag=true
break
end
end
if(flag==false)then
table.insert(self.eventTb[event],listener)
end
end
function eventDispatcher:removeEventListener(event,listener)
print("remove event listener:",event,listener)
if(listener==nil or self.eventTb[event]==nil)then
do return end
end
local length=#self.eventTb[event]
for i=1,length do
if(self.eventTb[event][i]==listener)then
table.remove(self.eventTb[event],i)
i=i-1
end
end
end
-- data 给被监听者传回需要的数据
function eventDispatcher:dispatchEvent(event,data)
print("dispatch event:",event)
if(self.eventTb[event])then
for k,v in pairs(self.eventTb[event]) do
print("listener:",v)
if(v)then
v(event,data) --需要时执行监听,将数据传给被监听着
end
end
end
end
function eventDispatcher:hasEventHandler(event,listener)
if(self.eventTb[event]==nil)then
return false
end
if(listener==nil)then
if(self.eventTb[event] and #self.eventTb[event]>0)then
return true
else
return false
end
end
for k,v in pairs(self.eventTb[event]) do
if(v==listener)then
return true
end
end
return false
end
function eventDispatcher:clear()
self.eventTb={}
end
以上就是监听器类的具体实现,对应刷新野怪的功能,大概意思就是在刷野怪的地方添加一个监听者addEventListener,当距离上一波野怪死去的时间达到刷野怪的要求时,dispatchEvent就会执行监听,然后野怪就会刷新,当游戏结束时调用removeEventListener移除监听。