您的位置:首页 > 其它

关于全局和局部的输入事件处理的一些零碎教训

2012-05-15 11:17 316 查看
事件响应作为一种街坊共知的基础功能,存在于很多语言或者开发工具里,例如MFC,JavaScript,.Net,As3...

现在,俺在这里用的还是as3,虽然早期也用过.Net和MFC,不过还是用现在进行时的比较好说嘛;

一个悲剧:

俺早期做一些前端开发时,多数时候会从使用的便利性出发,直接就在目标控件上绑事件方法,轻松愉快;

除了鼠标移动等比较明显会拖性能的方法,大多的输入事件,例如点击、滚轮、键盘等,都觉得,事件对控件,准确又轻松;

事实上是这样,准确又轻松,但是随着控件一个个多起来,而且到了后来,为了给项目瘦身,需要把控件大都过滤合并掉的时候,

数一下

function onMouseDown(e:Event){ // do something }

几十个,漫山遍野地分布在各个package里,

俺捶地了;

另一个悲剧;

在早期,控件绑事件的原始开发时,往往会犯一的一个基础错误就是,逻辑也扔到响应函数里面处理,而且过分的是有时候是完整的逻辑块,

这明晃晃的就是跟MVC对着干;

很快,俺就乖乖的认错,下着决心以低耦合的原则,理顺业务,划分好事务、控制、表现层,

正当春风得意地把新搞的一套一点点代入时,输入事件的处理又来出问题了;

按照俺的设想,里面的所有数据流都要尽量保持单向,例如,接受了输入(无论是keyboard还是socket),就通过逐层处理,中途尽量不做模块间递归,最后到达显示层,

但是,如果以控件自身绑输入事件的做法,那么,以该控件为显示层的输入流处理就成了:

sprite.onMouseDown ----> logic.do_something ----> sprite.show,

不是说这样不行,也不是说这样不好,只是,这样不符合自己的一些预设想法,特别是当一个人进入了单向流洁癖时期;

俺洁癖了;

于是,后来的做法也很简单,复古;

模拟DirectX或者干脆是GDI时期的做法,只在stage层监听输入事件,也就是,一个项目只有一个输入处理中心,俺定义为Controller.as;

做的事情也很简单,无非就是绑好下面几个事件:

this.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.m_down);

this.stage.addEventListener(MouseEvent.MOUSE_UP, this.m_up);

this.stage.addEventListener(KeyboardEvent.KEY_DOWN, this.key_down);

this.stage.addEventListener(KeyboardEvent.KEY_UP, this.key_up);

MOUSE_MOVE还是敬谢不敏;

然后switch,也不一定,

通过其连接的逻辑层(输入处理层),可以通过切换接受输入对象等方法,手工模拟类似focus的效果;

例如:

logic.acceptor = SpriteA.do;

然后根据需求,通过一些事务逻辑的影响,俺们可以做到

logic.acceptor = SpriteB.do;

这样,也不用在响应函数里面塞进长长的流处理语句;

看到这里,各位第一个反应大概如下:

蛋疼!

甭说了,俺也觉得,但是为了不再重演上面两个悲剧,少捶地,满足洁癖,俺能想到的点子就是这样,

放弃便利性,土方法土用;

不过,当这一套搭建好后,感觉用起来也挺清爽的,而且可以控制的要素也更丰富了,对于俺这没啥技术含量但又爱动手的人来说刚好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: