luaによるリスナーの実現

2409 ワード

リスナーは,文字通り傍受に用いられ,プログラム上の役割も事実上そうである.
例えば、ゲームの王者の栄光の中で、すべての小兵が現れた時間、小龍が初めて現れた時間、第1波の野怪が現れた時間は固定されています.つまり、時間が来るとすぐに現れます.それ以外にも、一波の野怪がすべて死んで次の波と同じ位置に野怪が再び現れるまでの時間間隔も固定されている.リスナーを用いて,リスニング時間,到達点自動トリガ法により,対応する野怪やドラゴンを再生成することができる.
luaファイルを作成するlua(javaクラスと見なすことができる)
クラス内のメソッドの説明:
  • addEventListener(event,listener):リスナーを追加
  • dispatchEvent(event,data):実行リスナー
  • removeEventListener(event,listener):リスナー
  • を削除
  • hasEventHandler(event,listener):リスナーがあるかどうかを判断する
  • clear():Listener
  • をクリア
    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を呼び出してリスニングを削除することを意味する.