利用lua实现监听器

       监听器,从字面上看是用来监听的,在程序上起到的作用事实上也是如此。

比如:在游戏王者荣耀中,每一波小兵出现的时间、小龙第一次出现的时间、第一波野怪出现的时间都是固定的,即时间一到立即出现。除此之外,一波野怪全部死去到下一波相同位置野怪再次出现的时间间隔也是固定的。我们可以用监听器通过监听时间,到点自动触发方法来重新生成对应的野怪或者大龙。

建一个lua文件eventDispatch.lua(可以看成一个java类)

类中方法说明:

  1. addEventListener(event,listener):添加监听器
  2. dispatchEvent(event,data):执行监听器
  3. removeEventListener(event,listener):移除某个监听器
  4. hasEventHandler(event,listener):判断有没有某个监听器
  5. 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移除监听。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值