游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4554|回复: 0

事件/消息派发

[复制链接]

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
发表于 2014-3-20 10:37:41 | 显示全部楼层 |阅读模式

项目工程中经常使用事件/消息派发以及消息回调机制,最近在工作中我遇到了事件派发器的一点小问题在此记录以备之后再次使用。


一. 事件派发器需求:  

A类为一个数据功能集合 其包含很多属性 A.a A.b A.c,每个属性又包含很多子属性 依次。。  要求任意属性或者其子属性发生变化时刷新/调用B类一个回调方法。


二. 实现方式一 --------------------------全局消息/事件管理器


采用观察者模式实现一个全局事件管理器。

1. 观察者模式基本原理: 所谓观察者模式也就是某一主题保存所有关心此主题的所有观察者信息 ,当主题出现时通知所有观察者。

   

         当各种属性发生变化时所需要做出反应的类作为一个观察者/侦听者  在所有属性发生变化时派发消息事件从而完成对属性变化消息的侦听。


注: 简单的全局消息派发存在一个缺陷即侦听者/观察者一旦被注册将会无条件执行消息回调,例如有两个B类的对象b1 b2都注册了事件回调,当a1属性变化时会抛出事件此时b1 b2均响应回调而我们此时可能只想b1对象响应。(当然此问题可以通过增加优先级 增加定向消息派发等机制解决 但无疑会增加其复杂性)


三. 实现方式二 --------------------------消息冒泡

为了解决全局消息派发不能指定侦听对象这一缺陷,我借鉴AS3消息冒泡机制实现这一消息向上传递的需求。

冒泡机制:


as3的事件过程包括三个阶段 捕获,目标和冒泡阶段。下面我举一个很简单的例子来说明冒泡机制。舞台stage上有一个元件mc,mc上有一个子按钮元件btn.


捕获阶段:鼠标在btn上发出点击事件。首先捕获该事件的是stage,然后向下传递到mc,再到btn
目标阶段:找到鼠标的最底层的目标btn,如果它注册了监听函数,就执行该监听函数了
冒泡阶段:开始冒泡,自底向上。从btn到mc,最后到stage
也就是说当点击事件触发时btn会先捕获此事件 处理后向上层的mc派发 之后再向stage派发

类似的我将A的各个属性及每个属性的子属性作为(stage -- mc -- btn)任何属性变化时都会向上冒泡 在A类中提供注册冒泡消息回调的方法(调用B类的事件触发),这样就可以保证指定目标的消息派发。

注: 此种方式只针对侦听者只有一个且要区分指定目标的消息派发时较为好用,与全局消息派发互补.

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 05:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表