• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>AS 应用>文章内容
  • as3.0 键盘事件优化与扩展
  • 来源:吾系衰人的博客 作者:吾系衰人 2008-07-09 【

对于3.0的键盘事件实在太无语了~

自己改良了下~效果不错~

提供4个事件

 KEY_IS_DOWN;
 KEY_DOWN
  KEY_UP

KEY_CONTINUUM

KEY_IS_DOWN;
事件触发后可以调用getisDown():方法返回处于按下状态的所有键盘对应的keyCode值得数组;

 KEY_CONTINUUM事件跟KEY_DOWN事件触发后可以调用getkey()方法获取单击或连击的所有keyCode值的一个数组;
而且KEY_CONTINUUM跟KEY_DOWN两者同时只会触发一个,而且跟KEY_IS_DOWN事件相互独立,这样就不用担心键盘弹起会影响到KEY_IS_DOWN的准确性。

 package com.golive2.core.util.keyboard
{
 import flash.display.*;
 import flash.events.*;
 import flash.utils.*;
 public class KeyboardState extends EventDispatcher {
  public static const KEY_IS_DOWN:String='keyboardStateKeyIsDown';
  public static const KEY_DOWN:String='keyboardStateKeDown';
  public static const KEY_UP:String='keyboardStateKeUp'
  public static const KEY_CONTINUUM:String='keyboardStateContinuum '
  public var interval:uint=200;
  private var timerIndex:Timer=new Timer(80);//运行过程中的timer主要用于isdown数组的检查
  private  var isDown:Boolean=false;
  private  var keyDown:Boolean=false;
  private var reSetkeyDown:Boolean=false;
  private var t1:int=0
  private var t2:int=0
  private var timeList:Array=new Array()
  private var keyCode:uint;
  private var stage:DisplayObjectContainer;
  private var  isContinued:Boolean=false
  private var lock:Boolean=true;
  private var isDownArray:Array=new Array()


  public function KeyboardState(item:*,frame:uint=200,...res) {
        stage=item.stage;
        interval=frame
   stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownFunc);
   stage.addEventListener(KeyboardEvent.KEY_UP, keyUpFunc);
   timerIndex.addEventListener(TimerEvent.TIMER,timerInit)
   timerIndex.start()
   
  }
  
  private function keyUpFunc(event:KeyboardEvent):void
  {
////////////////////////////////////删除不再isDown的值/////////////////////////
   var deleteKey:uint=event.keyCode 
   
   for(var i:uint=0;i<isDownArray.length;i++)
    {
     if(deleteKey==isDownArray[i])
     {
      isDownArray.splice(i,1)
      i--
     }
    }
//////////////////////////////检测是连击还是单击////////////////////////////////    
  t2=getTimer()
  if(t2-t1<=interval)
   {
    //连击键盘
   timeList.push(event.keyCode)
   dispatchEvent(new Event(KeyboardState.KEY_CONTINUUM))
 
  }else{
   //单击键盘   
   timeList=new Array();
   timeList.push(event.keyCode)
   dispatchEvent(new Event(KeyboardState.KEY_DOWN))
   }
//////////////////////////////////////////////////////////////////////////   
   this.reSetkeyDown=this.keyDown=this.isDown=false;
   stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpFunc);
   stage.addEventListener(KeyboardEvent.KEY_UP, keyUpFunc);
   t1= t2
   //松开键盘
  dispatchEvent(new Event(KeyboardState.KEY_UP))
  }
  
  private function timerInit(event:TimerEvent):void
  {
   stage!=null?stage.stage.focus =stage.stage:''
   
   if(isDownArray.length>0)
   {
    dispatchEvent(new Event(KeyboardState.KEY_IS_DOWN)) 
   }
  
  }
  private function keyDownFunc(event:KeyboardEvent):void {
    if(!this.keyDown)
    {
     this.keyDown=true
    }
    if(this.keyDown)
    {
     var count:int=0
     for(var i:uint=0;i<isDownArray.length;i++)
     {
      if(event.keyCode!=isDownArray[i])
      {
       count++;
      }
     }
     if(count==isDownArray.length)
      {
       isDownArray.push(event.keyCode)
      }
    }
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownFunc);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownFunc);
  }
  
     public function getkey():Array{
      return timeList
     }
    
  public function getisDown():Array
  {
   return isDownArray
  
  }
 }
}

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://wxsr.blogbus.com/logs/24406698.html




上一篇:实用的AS3共享事件sharedEvents   下一篇:简单翻转相册 (as2.0)
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)


FLASH源文件

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)