[cocos2dx_lua]Lua版自定义事件分发系统


--事件系统
----------------------------------
local EventSystem = class("EventSystem")
function EventSystem:ctor()
    self._eventBus = {}
end

-- _eventBus[eventName][tag] = listener
function EventSystem:regEvent(eventName,listener,tag)
    print(eventName,tag)
    if type(eventName) == "string" and type(listener) == "function" then
        if not self._eventBus[eventName] then self._eventBus[eventName] = {} end
        tag = tag .. ''
        self._eventBus[eventName][tag] = listener
        printf("[[通知中心 %s 注册 %s 成功! ]]",eventName,tag)
    else
        printf("[[通知中心 %s 注册 %s 失败! ]]",tostring(eventName),tag .. '')
    end
end


function EventSystem:postEvent(eventName,data)
    assert(eventName,"EventSystem:postEvent eventName = nil")
    local target = self._eventBus[eventName]
    if not target then printf("[[通知中心 %s 不存在! ]]",eventName) return end

    local event = { eventName = eventName,tag = nil,data = data }
    if target then
        for _tag,v in pairs(target) do
            printf("[[通知中心 向 %s 发送 %s 成功! ]]",_tag,event.eventName)
            event.tag = _tag
            v( event )
        end
    end
end

function EventSystem:unRegEvent(eventName,tag)
    if self._eventBus[eventName] then
        tag = tag .. ''
        self._eventBus[eventName][tag] = nil
        printf("[[通知中心 %s 注销 %s 成功! ]]",tag)
    else
        printf("[[通知中心 %s 注销 %s 失败! ]]",tag)
    end
end

function EventSystem:unRegEventByName(eventName)
    if self._eventBus[eventName] then
        self._eventBus[eventName] = nil
        printf("[[通知中心 %s 注销成功! ]]",eventName)
    else
        printf("[[通知中心 %s 注销失败! ]]",eventName)
    end
end


function EventSystem:hasEventListenerByName(eventName)
    local t = self._eventBus[eventName]
    if not t then return false end
    for _,__ in pairs(t) do
        return true
    end
    return false
end

function EventSystem:hasEventListener(eventName,tag)
    return (not self._eventBus[eventName][tag .. ''])
end

function EventSystem:removeAllEventListeners()
    self._eventBus = {}
end

function EventSystem:dumpAllEventListeners()
    print("---- EventSystem:dumpAllEventListeners() ----begin")
    for name,listeners in pairs(self._eventBus) do
        printf("-- event: %s",name)
        for tag,listener in pairs(listeners) do
            printf("--     tag: %s,listener: %s",tostring(tag),tostring(listener))
        end
    end
    print("---- EventSystem:dumpAllEventListeners() ----end")
end

return EventSystem

[设计模式]Observer观察者模式

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...