• 项目记录22-- tolua基于lua框架事件派发


     每天晚上抽点时间写一点点就一点点,曾经不写博客可是如今。不为别的仅仅是为了告诉别人我还存在。

            这几天在地铁上发现好多人都还在玩消除游戏,今天起码看到5个人,可是玩的版本号都不一样。看来休闲游戏还是有市场的。

    (题外话)

            说到lua的事件派发。事实上非常easy就是一个table的事,这个是View里面自己的一个内置派发。全部view都继承它。还有就是我不是大神,仅仅是任劳任怨的小兵。全部就简单化了。

    --[[
            2016-2-23 xinghua
    ]]
    local EventDispatcher = class("EventDispatcher")


    local _Events = nil


    function EventDispatcher:ctor( )
            _Events = {}
    end
    --[[
            表结构
            {
                    type = {
                            Listener1,
                            Listener2
                    }
            }
    ]]
    --注冊监听事件
    function EventDispatcher:AddEventListener(stype,Listener)
            if type(stype) ~= "string" or type(Listener) ~= "function" then
                    error("AddEventListener error : type error ",2)
                    return
            end
            --获取_Events里面事件
            local eventlist = _Events[stype]


            if eventlist == nil then
                    eventlist = {}
                    table.insert(eventlist,Listener) --想队列里面插入一个事件
                    _Events[stype] = eventlist   --放到大表里面
            else
                    local func = eventlist[Listener]
                    if func == nil then
                            table.insert(eventlist,Listener)
                    else
                            error("AddEventListener error : listeren hai in")
                    end
            end
    end


    --[[
            触发
            ]]
    function EventDispatcher:Dispatcher(stype,...)
            if type(stype) ~= "string" then
                    error("Dispatcher error : stype error",1)
                    return
            end


            local listeners = _Events[stype]
            if listeners == nil or #listeners <= 0 then
                    return
            end
            for i,v in ipairs(listeners) do
                    v(...)
            end
    end


    --[[
            移除指定类型的全部关联事件侦听,假设參数为nil则删除当前注冊器中全部的函数侦听
            listener ~= nil 删除这个类型里面这个监听
    ]]
    function EventDispatcher:RemoveEventListeners(stype,listener)
            --空删除全部清空表
            if stype == nil then
                    --获取keys
                    local keys = table.keys(_Events)
                    for i,v in ipairs(keys) do
                            _Events[v] = nil --设置为空
                    end
                    return
            end                
            if type(stype) ~= "string" then
                    error("RemoveEventListeners error : stype no string",2)
                    return
            end
            local typeListeners  = _Events[stype] --取出里面全部的这个类型的func
            --依据类型删除
            if listener ~= nil and type(listener) == "function" then
                    if typeListeners ~= nil and table.nums(typeListeners) > 0 then
                            if typeListeners[listener] ~= nil then
                                    typeListeners[listener] = nil
                            end
                    end
                    return
            end
            --删除一个类型
            if typeListeners ~= nil then 
                    _Events[stype] = nil
            end
    end


    function  EventDispatcher:DumpEvent( )
            dump(_Events)
    end


    return EventDispatcher


  • 相关阅读:
    跨控制器跳转view——RedirectToRoute和RedirectToAction
    Web GIS离线解决方案
    逆变与协变详解
    C#操作符??和?:
    DBNull与Null的区别
    C#用DataTable实现Group by数据统计
    LINQ系列:LINQ to DataSet的DataTable操作
    Repeater数据控件的两个重要事件ItemDataBound 和 ItemCommand
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    ADO.NET 数据库备份等操作
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7073233.html
Copyright © 2020-2023  润新知