zoukankan      html  css  js  c++  java
  • 项目记录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


  • 相关阅读:
    图的深度优先搜索(递归和非递归c++实现)
    第十届蓝桥杯大赛软件类省赛 迷宫问题题解
    第十届蓝桥杯大赛软件类省赛研究生组 试题D:最短路
    第十届蓝桥杯大赛软件类省赛研究生组 试题H:修改数组
    Redis设计与实现书中勘误-sdstrim函数解释错误
    Clion 引入libevent Undefined symbols for architecture x86_64: "
    RabbitMQ Linux 下 安装
    kafka基本使用
    2种方法改变String 值
    Maven学习笔记-1
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7073233.html
Copyright © 2011-2022 走看看