关于全局和局部的输入事件处理的一些零碎教训
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;
这样,也不用在响应函数里面塞进长长的流处理语句;
看到这里,各位第一个反应大概如下:
蛋疼!
甭说了,俺也觉得,但是为了不再重演上面两个悲剧,少捶地,满足洁癖,俺能想到的点子就是这样,
放弃便利性,土方法土用;
不过,当这一套搭建好后,感觉用起来也挺清爽的,而且可以控制的要素也更丰富了,对于俺这没啥技术含量但又爱动手的人来说刚好。
现在,俺在这里用的还是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;
这样,也不用在响应函数里面塞进长长的流处理语句;
看到这里,各位第一个反应大概如下:
蛋疼!
甭说了,俺也觉得,但是为了不再重演上面两个悲剧,少捶地,满足洁癖,俺能想到的点子就是这样,
放弃便利性,土方法土用;
不过,当这一套搭建好后,感觉用起来也挺清爽的,而且可以控制的要素也更丰富了,对于俺这没啥技术含量但又爱动手的人来说刚好。
相关文章推荐
- 关于GridView RowUpdating事件中处理一些前台特殊控件,例如 下拉框DropDownList 等等
- 关于symbian按键事件的一些总结(2)----------按键事件的处理
- 关于触摸事件处理的一些辅助类和回调方法(下)
- 关于处理某一个事件需要关联多个事件或表的情况下,一些思考
- 重要的经典的贴子:关于M8程序时运行中一些意外事件的处理
- 关于触摸事件处理的一些辅助类和回调方法(上)
- 【U3D】关于 UGUI按钮:Button 以及事件:EventTrigger 的一些经验教训
- javascript事件处理--关于事件的一些基础定义
- 一点关于Android事件处理的知识
- 关于C++全局变量和静态变量初始化的一些总结
- ABAP--关于ABAP流程处理的一些命令的说明(stop,exit,return,check,reject)
- 关于mysql事件处理的方法
- 关于apache应用,受到攻击的一些处理办法
- SDL事件处理(一些数据类型)
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节
- 关于session会话事件处理
- 关于前端一些零碎的知识.
- 事件冒泡的一些应用_利用事件冒泡处理多个事件[1]
- IOS事件处理机制(关于触发者和响应者的确认)
- 关于cloudstack中遇见的一些问题处理笔记