青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

戰魂小筑

討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

   :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

為了降低模塊間的耦合, 很多系統使用事件派發機制, 接收方無需知道派發者是誰.在Qt中,這個系統被稱作Slot&Signal, 需要配合moc代碼生成機制, 但是系統本身是線程安全的.

這里我們討論的是lua的事件派發機制, 我將此寫成lua模塊, 方便配合cocos2dx進行邏輯處理

 

local Global = _G
local package = _G.package
local setmetatable = _G.setmetatable
local assert = _G.assert
local table = _G.table
local pairs = _G.pairs
local ipairs = _G.ipairs
 
 
module "Core.EventDispatcher"
 
--[[
數據層次
 
["EventName1"] =
{
    ["_StaticFunc"] = { Func1, Func2 },
    
    [Object1] = { Func1, Func2 },
    [Object2] = { Func1, Func2 },
},
 
["EventName2"] =
{
    ...
}
 
]]
 
-- 默認調用函數
local function PreInvoke( EventName, Func, Object, UserData, ... )
    
    if Object then
        Func( Object, EventName, ... )
    else
        Func( EventName, ... )
    end
 
end
 
function New( )    
    
    local NewObj = setmetatable( {}, { __index = package.loaded["Core.EventDispatcher"] } )
    
    -- 對象成員初始化
    NewObj.mPreInvokeFunc = PreInvoke
    NewObj.mEventTable = {}
    
    return NewObj
end
 
-- 添加
function Add( Self, EventName, Func, Object, UserData )
 
    assert( Func )
 
    Self.mEventTable[ EventName ] = Self.mEventTable[ EventName ] or {}
    
    local Event = Self.mEventTable[ EventName ]
    
    if not Object then
        Object = "_StaticFunc"
    end
    
    Event[Object] = Event[Object] or {}
    local ObjectEvent = Event[Object]
 
    ObjectEvent[Func] = UserData or true
    
end
 
-- 設置調用前回調
function SetDispatchHook( Self, HookFunc )
    
    Self.mPreInvokeFunc = HookFunc
end
 
 
-- 派發
function Dispatch( Self, EventName, ... )
 
    assert( EventName )
    
    local Event = Self.mEventTable[ EventName ]
    
    for Object,ObjectFunc in pairs( Event ) do
        
        if Object == "_StaticFunc" then
                
            for Func, UserData in pairs( ObjectFunc ) do
                Self.mPreInvokeFunc( EventName, Func, nil, UserData, ... )    
            end
            
        else
        
            for Func, UserData in pairs( ObjectFunc ) do
                Self.mPreInvokeFunc( EventName, Func, Object, UserData, ... )
            end
        
        end
 
    end
 
end
 
-- 回調是否存在
function Exist( Self, EventName )
 
    assert( EventName )
    
    local Event = Self.mEventTable[ EventName ]
    
    if not Event then
        return false
    end
    
    -- 需要遍歷下map, 可能有事件名存在, 但是沒有任何回調的
    for Object,ObjectFunc in pairs( Event ) do
    
        for Func, _ in pairs( ObjectFunc ) do
            -- 居然有一個
            return true
        end
    
    end
    
    
    return false
    
end
 
-- 清除
function Remove( Self, EventName, Func, Object )
    
    assert( Func )
    
    local Event = Self.mEventTable[ EventName ]
    
    if not Event then
        return
    end
    
    if not Object then
        Object = "_StaticFunc"
    end
    
    
    local ObjectEvent = Event[Object]
    
    if not ObjectEvent then
        return
    end
    
    ObjectEvent[Func] = nil
 
        
end
 
-- 清除對象的所有回調
function RemoveObjectAllFunc( Self, EventName, Object )
 
    assert( Object )
    
    local Event = Self.mEventTable[ EventName ]
    
    if not Event then
        return
    end
    
    Event[Object] = nil
 
end
 

這里注意下, 我是將EventDispatcher.lua放置在Core目錄下, 因此需要使用require “Core.EventDispatcher”進行調用

使用用例

 

    local EventDispatcher = require 'Core.EventDispatcher'
 
    local E = EventDispatcher.New()
 
 
    E:Add( "a", function( a, b )   print( a, b ) end )
 
    local Func = function( a )   print( a ) end 
    E:Add( "a", Func )
 
 
    E:Dispatch("a", 1, 2 )
    print( E:Exist("a"), E:Exist("b"))
 
    E:Remove("a", Func )
 
    E:Dispatch("a", 1, 2 )
    print( E:Exist("a"), E:Exist("b"))
posted on 2013-04-24 15:19 戰魂小筑 閱讀(7080) 評論(0)  編輯 收藏 引用 所屬分類: 腳本技術
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区免费观看| 亚洲伊人观看| 亚洲欧洲av一区二区三区久久| 在线看片成人| 亚洲日本电影| 亚洲网站啪啪| 羞羞色国产精品| 久久国产精品高清| 六月丁香综合| 亚洲欧洲日韩女同| 亚洲国产精品va在线看黑人| av成人国产| 欧美专区亚洲专区| 欧美88av| 国产美女精品| 亚洲黑丝在线| 欧美一级精品大片| 欧美1区2区| 亚洲一区二区视频| 久久综合影音| 国产精品欧美经典| 亚洲黄网站黄| 欧美一区二区视频97| 欧美国产成人在线| 亚洲在线一区| 欧美激情在线有限公司| 国产视频一区三区| 日韩亚洲一区二区| 久久蜜臀精品av| 夜夜嗨av一区二区三区网站四季av | 欧美不卡福利| 日韩视频免费看| 欧美一区亚洲一区| 欧美日韩在线播放三区| 在线欧美小视频| 久久成人免费日本黄色| 亚洲精品123区| 久久成人资源| 国产精品chinese| 亚洲日韩视频| 巨乳诱惑日韩免费av| 亚洲主播在线播放| 欧美日韩在线大尺度| 亚洲人成网站999久久久综合| 午夜精品理论片| 99视频日韩| 欧美美女bbbb| 亚洲激情小视频| 免费观看一区| 久久国产精品亚洲va麻豆| 国产精品久久久久久av下载红粉 | 国产一区二区欧美| 亚洲欧美成人综合| 一区二区黄色| 欧美日韩亚洲综合| 99riav久久精品riav| 欧美电影专区| 欧美va天堂| 亚洲精品视频中文字幕| 亚洲福利视频一区| 欧美国产日韩在线| 亚洲精品视频中文字幕| 亚洲日本va午夜在线电影| 欧美成人精品一区| 亚洲精品韩国| 日韩午夜电影在线观看| 欧美系列亚洲系列| 欧美中文字幕在线播放| 欧美在线视频播放| 亚洲狠狠婷婷| 在线综合亚洲欧美在线视频| 国产精品久久久久久久久免费樱桃| 亚洲一区二区高清| 亚洲欧美中文日韩在线| 亚洲午夜三级在线| 国产欧美在线视频| 另类尿喷潮videofree| 免费视频久久| 亚洲小说欧美另类社区| 国产精品男人爽免费视频1 | 一区二区在线视频播放| 欧美一区二视频在线免费观看| 亚洲视频在线播放| 国产视频一区在线| 欧美va日韩va| 欧美日韩色婷婷| 久久成人这里只有精品| 久久一区二区视频| 亚洲图色在线| 久久男人资源视频| 一区二区三区产品免费精品久久75 | 一区二区三区日韩欧美精品| 一区二区免费在线播放| 国产一区激情| 欧美成人影音| 国产精品美腿一区在线看| 久久久777| 欧美日韩国产精品| 久久久视频精品| 欧美日韩在线高清| 久久夜色精品国产欧美乱| 欧美激情乱人伦| 久久福利影视| 欧美日本簧片| 欧美成人小视频| 国产欧美一区二区三区视频| 亚洲激情在线播放| 国产综合香蕉五月婷在线| 亚洲日本va午夜在线影院| 国产精品乱码人人做人人爱| 欧美激情精品久久久久久黑人| 国产精自产拍久久久久久| 亚洲精品综合在线| 亚洲第一成人在线| 欧美一进一出视频| 亚洲欧美日韩在线观看a三区| 欧美成人午夜影院| 久久久久久久久久久成人| 国产精品二区三区四区| 最近中文字幕日韩精品| 狠狠色综合色区| 亚洲一区国产一区| 亚洲天堂久久| 欧美精品一区在线播放| 久久久亚洲成人| 国产欧美精品久久| 一区二区三区视频在线观看| 日韩一区二区高清| 久久乐国产精品| 久久久久久69| 国产欧美69| 亚洲欧美日韩在线高清直播| 亚洲激情在线视频| 欧美一区二区三区视频免费| 欧美一区免费| 国产日韩欧美自拍| 午夜欧美视频| 免费视频最近日韩| 女同性一区二区三区人了人一 | 亚洲精品一区中文| 亚洲人成毛片在线播放| 欧美成人蜜桃| 欧美黄色日本| 亚洲人成在线观看网站高清| 蜜臀av在线播放一区二区三区| 狂野欧美一区| 亚洲欧洲精品一区| 欧美激情麻豆| 亚洲一本大道在线| 久久久久看片| 亚洲精品1234| 欧美日韩国产黄| 亚洲欧美日韩一区| 久久久久久久性| 黑人巨大精品欧美一区二区小视频 | 亚洲天堂激情| 欧美天天影院| 先锋影音一区二区三区| 久久这里有精品15一区二区三区| 樱桃成人精品视频在线播放| 久久综合给合| 亚洲日本一区二区| 亚洲亚洲精品在线观看| 国产日韩1区| 欧美成人国产va精品日本一级| 亚洲精品男同| 久久久久久**毛片大全| 99国产精品99久久久久久| 欧美电影在线观看| 亚洲午夜精品久久久久久浪潮 | 亚洲一区国产一区| 国产尤物精品| 欧美精品 日韩| 午夜精品久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲人精品午夜在线观看| 欧美午夜不卡视频| 久久精品72免费观看| 91久久黄色| 久久免费视频在线观看| 一区二区三区四区五区视频 | 一区二区三区久久网| 久久综合久久久久88| 亚洲性线免费观看视频成熟| 亚洲国产成人91精品| 国产精品麻豆成人av电影艾秋| 欧美成人免费网站| 欧美在线看片| 正在播放亚洲一区| 亚洲高清不卡一区| 亚洲欧洲在线观看| 国产亚洲欧美日韩在线一区| 欧美另类女人| 久久尤物电影视频在线观看| 亚洲一区日韩| 亚洲麻豆视频| 亚洲第一精品久久忘忧草社区| 久久精品日韩| 欧美亚洲网站| 亚洲欧美日韩综合aⅴ视频|