原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]

博客地址:http://blog.csdn.net/qq446569365

事件分发机制是程序开发中非常常用的一种方式。在Cocos中,触摸,重力感应等事件都是通过事件分发机制分发给各个监听器。

本模块通过lua实现事件分发机制。可大幅降低各模块间的耦合,将事件调用从各模块中分离出来,接收方无需知道派发者是谁。

该类主要用于网络通讯数据的分发。

在事件分发的接收方法中,如果返回true,将默认为本次分发已被处理,将终止后续分发。

若无返回,或返回为false,将继续事件的后续分发。

注:如果为静态方法,objec写nil

直接上代码:

--[[
-------------------------------------------------
    Eventdispatcher.lua
    Created by ArcherPeng on 15-01-04.
-------------------------------------------------
功能概述:
本模块实现事件分发机制。可大幅降低各模块间的耦合,接收方无需知道派发者是谁。
该类主要用于网络通讯数据的分发。
在事件分发的接收方法中,将默认为本次分发已被处理,将终止后续分发。
若无返回,将继续事件的后续分发。
注:如果为静态方法,objec写nil
-------------------------------------------------
用法简述  
--事件监听器
function GameScene:callback(eventKey,msg)  --  msg收到分发事件时传入的参数2
    print("eventName:["..eventKey.."]--msg:["..msg.."]--end")
    return true -- 该事件已消费,终止后续分发流程
end



--添加事件监听
local eventdispatcher=require("APUtils.Eventdispatcher"):getInstance()  --或 APUtils.Eventdispatcher:getInstance() 
eventdispatcher:add("12_33",GameScene.callback,self)
eventdispatcher = nil



--分发事件
eventdispatcher=require("APUtils.Eventdispatcher"):getInstance()
eventdispatcher:dispatch("12_33","12_33 received!") -- 参数2可以为任何变量,包括table 

提示:
可以在 layer clearup方法中调用
APUtils.Eventdispatcher:destoryInstance() -- 销毁事件分发器 以取消之前的全部监听

数据层次结构
["eventKey1"] =
{
["_StaticFunc"] = { func1,func2 },[object1] = { func1,[object2] = { func1,},["eventKey2"] =
{
...
}
]]
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
local Eventdispatcher = class("APUtils.Eventdispatcher")
 
-- 默认调用函数
function Eventdispatcher:preInvoke( eventKey,func,object,userData,... )
    if object then
        return func( object,eventKey,... )
    else
        return func( eventKey,... )
    end
 
end
function Eventdispatcher:ctor( )    
    -- 对象成员初始化
    self.eventTable = {}
end
 
-- 添加
function Eventdispatcher:add( eventKey,userData )
    assert( func )
    self.eventTable[ eventKey ] = self.eventTable[ eventKey ] or {}
    
    local event = self.eventTable[ eventKey ]
    
    if not object then
        object = "_StaticFunc"
    end
    
    event[object] = event[object] or {}
    local objectEvent = event[object]
 
    objectEvent[func] = userData or true
    
end
 
-- 设置调用前回调
function Eventdispatcher:setdispatchHook( hookFunc )
    
    self.preInvoke = hookFunc
end
 
 
-- 派发
function Eventdispatcher:dispatch( eventKey,... )
 
    assert( eventKey )
    
    local event = self.eventTable[ eventKey ]
    if not event then return end
    for object,objectFunc in pairs( event ) do
        
        if object == "_StaticFunc" then
                
            for func,userData in pairs( objectFunc ) do
                if self:preInvoke( eventKey,nil,... )  then return end
            end
            
        else
        
            for func,... ) then return end
            end
        
        end
 
    end
 
end
 
-- 回调是否存在
function Eventdispatcher:exist( eventKey )
 
    assert( eventKey )
    
    local event = self.eventTable[ eventKey ]
    
    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 Eventdispatcher:remove( eventKey,object )
    
    assert( func )
    
    local event = self.eventTable[ eventKey ]
    
    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 Eventdispatcher:removeObjectAllFunc( eventKey,object )
 
    assert( object )
    
    local event = self.eventTable[ eventKey ]
    
    if not event then
        return
    end
    
    event[object] = nil
 
end
 
 
function Eventdispatcher:getInstance()

    if _G.APUtils_Eventdispatcher_Instance == nil then _G.APUtils_Eventdispatcher_Instance = Eventdispatcher.new() end return _G.APUtils_Eventdispatcher_Instance
end
function Eventdispatcher:destoryInstance()
    _G.APUtils_Eventdispatcher_Instance = nil
end
_G.APUtils = _G.APUtils or {}
_G.APUtils.Eventdispatcher = _G.APUtils.Eventdispatcher or Eventdispatcher
return Eventdispatcher

 <span style="font-size:18px;">
</span>

[寒江孤叶丶的Cocos2d-x之旅_23]Cocos2d-x LUA实现事件分发器 lua EventDispatcher的更多相关文章

  1. ios – 如何使用string中的参数创建Selector

    我正在使用Swift3.1和Xcode8.3.3编写程序.我想创建一个类,负责在键盘出现和消失时移动整个视图.但是我在使用字符串参数创建自定义选择器时遇到了困难.要显示或隐藏键盘我们需要功能:我正在尝试创建一个这样的选择器:它正在编译,但是当键盘出现时,它会崩溃.因为它是独立的类我不能使用这种结构:因为它将Swift函数转换为Objective-C函数.所以问题是:如何用参数字符串创建一个Selector表单?

  2. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  3. ios – 如何为NSNotification编写单元测试

    我在swift工作,我想刷新一个页面,所以我使用通知发送它,我在一个ViewController中发布通知并在另一个中添加观察者,它工作正常.我想要做的是在swift中添加单元测试.我查了很多网站但是没能做到.我是新手,不知道从哪里开始.基本上工作是,当我点击按钮通知被发布时,并且当加载下一个视图控制器时,添加通知观察者.我该怎么做单元测试提前致谢编辑:码并添加观察者解决方法一般的解决方案是:使用

  4. 如何在iOS中为预期的assert / assertionFailure编写单元测试?

    这里的问题是,当someString参数为空字符串时,您可以保证函数不会失败–在您的实际应用程序中.这是因为断言不在发布版本中运行.结果是你可以在开发过程中使用assert作为调试的一种形式,但如果这种情况在现实生活中发生,你应该按顺序处理它,而不是崩溃.因此测试断言“发生”是否真的不是一种有效的单元测试技术,这就是为什么你以这种方式使用它的麻烦.

  5. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  6. ios – NSNotificationCenter多次呼叫

    我在我的应用程序中实现了NSNotificationCenter.我在完成图像解码时发送通知.第一次图像解码将完成8次.所以通知假设发送8次.但它调用64次(8*8).这是我的代码我是如何实现的–>//初始化//调用方法//解除分配//发布通知有人可以建议我做错了.提前致谢.//调用方法是这样的(调用8次)解决方法解:我重新检查了我的代码,initWithFrame:(CGRect)框架调用了8次

  7. ios – 使用NSMutableAttributedStrings快速更改文本颜色

    我有一个UITableView,我想在同一行中使用不同的颜色显示每行的文本.我试过这个代码,尝试从Obj-C翻译,但我不能让它工作这一切的输出是其中数字34对应于object.valueForKey!.description)被替换为{.如果我留下关于NSAttributedString的这段代码,行文本会正确显示.解决方法我认为问题可能在于分配给cell.textLabel?.attributedText.也许是这样的:不确定你是否希望字符串的第二部分是红色或其他颜色,所以我把它变黑了.

  8. ios – 核心数据并发调试:假阳性

    如WWDC2014session225(核心数据新增内容)所述,iOS8和OSX优胜美地的核心数据现在支持命令行参数-com.apple.CoreData.ConcurrencyDebug1,以启用检测到违反CoreData的并发合同的断言.在我的实验中,我发现它在iOS8beta1(在设备和模拟器中)都可以工作,但是我似乎发现了一个错误的肯定,即框架是抛出一个多线程违规异常不这样做至少这是我的信

  9. Xcode / iOS:如何隐藏Navigation-和ToolBar向下滚动?

    我想在iPhone上隐藏两个滚动条.当我向上滚动时,他们应该再次出现..我该如何处理?

  10. ios – 将阵列存储在Realm对象中

    我是Swift的新星.有没有办法在RealmObject中存储字符串数组?我有一个JSON对象像:如何将消息数组存储在权限密钥中?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部