• 2008-07-09

    as3.0键盘事件优化与扩展 - [as 3.0]

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

    对于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
      
      }
     }
    }


    收藏到:Del.icio.us




    评论

  • 能说说这具体怎么用吗?
    为什么我stage.addEventListener(KeyboardState.KEY_DOWN,control);要报错呢?