对于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
admin#flashas.net (#为@) 联系QQ:
:40777822
浙ICP备06033001号