2016-10-13 00:16:48 点击量:26 标签: 收藏本文
有一天,策划提了个这样的需求,在游戏背包中,如果仓库界面打开的情况下,单击物品则弹出操作菜单,如果是双击的话直接存储到仓库中。
单击弹出操作菜单
我想,这还不简单嘛,物品监听鼠标的MouseEvent.CLICK和MouseEvent.DOUBLE_CLICK两个事件不就行了嘛,然后分别处理对应的事件,我就开始敲代码了。
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- public class Main extends Sprite {
- public function Main() {
- if (stage)onInit();
- else stage.addEventListener(Event.ADDED_TO_STAGE, onInit);
- }
- private function onInit(event:Event = null):void {
- stage.removeEventListener(Event.ADDED_TO_STAGE, onInit);
- stage.addEventListener(MouseEvent.CLICK, onClickHandler);
- stage.doubleClickEnabled=true;
- stage.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClickHandler);
- }
- private function onDoubleClickHandler(event:MouseEvent):void {
- trace("酷播cuplayer.com双击放入仓库");
- }
- private function onClickHandler(event:MouseEvent):void {
- trace("酷播cuplayer.com单击弹出操作菜单");
- }
- }
- }
运行完后发现有问题,当我单击时,可以正确响应单击事件,但是当我双击时,不仅会响应双击事件,而且还会响应单击事件。就是原本我想双击放入仓库的,确实 有放入仓库,但是又弹出了操作菜单。原来是触发MouseEvent.DOUBLE_CLICK事件前会触发MouseEvent.CLICK事件,那有 没有办法不让双击时触发单击事件呢,查询了资料后发现没有办法改变flash本身的这个机制,那只能另辟蹊径了。下面是我的方法,原理很简单,就是判断在 很短的时间内,是单击了一下呢还是单击了两次。代码如下。
- package {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.utils.clearTimeout;
- import flash.utils.setTimeout;
- public class DoubleClick extends Sprite {
- private static const DOUBLE_CLICK_SPEED = 300;
- //双击事件的处理时间
- public function DoubleClick() {
- if (stage)onInit();
- else stage.addEventListener(Event.ADDED_TO_STAGE, onInit);
- }
- private var click_once:Boolean;
- private var time_id:uint;
- private function onInit(event:Event = null):void {
- stage.removeEventListener(Event.ADDED_TO_STAGE, onInit);
- stage.addEventListener(MouseEvent.CLICK, onMouseHandler);
- stage.doubleClickEnabled = true;
- stage.addEventListener(MouseEvent.DOUBLE_CLICK, onMouseHandler);
- }
- private function onMouseHandler(event:MouseEvent):void {
- if (time_id) {
- //如果time_id为true的话说明在300毫秒已经单击过了一次
- clearTimeout(time_id);
- onDoubleClickHandler();
- } else {
- //如果300毫秒后没有再次单击的话则调用单击事件
- time_id = setTimeout(onClickHandler, DOUBLE_CLICK_SPEED);
- }
- }
- private function onClickHandler():void {
- trace("单击弹出操作菜单");
- //单击完成后要初始化为0
- time_id=0;
- }
- private function onDoubleClickHandler():void {
- trace("双击放入仓库");
- }
- }
- }
现在可以正确响应单双击事件了,美中不足的一个是如果是单击的话,会有一点延迟的感觉,没有直接响应MouseEvent.CLICK事件来的灵敏,不过人无完人,这么点延迟还是可以接受的吧。
本文出自 unityas,转载时请注明出处及相应链接。
我们是一家提供综合软件外包与弱电工程服务的技术公司。
业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。
公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室