在AS2.0时代Flash的键盘控制有2种方式,1)key.isDown(code: Number) 和key.isUp(code: Number) 。2)键盘侦听Key.addListener(listener: Object)。而到了AS3.0就只剩下第2种类键盘侦听了,所以在这里我着重讲第2种。这里值得一提的就是在早期的一些FLASH版本中对于键盘侦听的正确性是有差别的。其中flash8 as2.0发布的SWF不能正确侦听onKeyUp事件在频繁触发事件的时候会有不触发现象出现。这也是为什么大部分对按键要求比较高的游戏都用flash 7来发布游戏的原因。到AS3.0 Flash 9之后就再没有这个问题了。
下面是一个简单的8向检测事例的AS3代码,测试按键为4个方向键
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.events.*;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
var ddd:Array=new Array();
ddd=[0,0,0,0];
//创建一个存放4个按键状态的数组,并且初始化值为0(up),当按下时为1(down)
function keyDownHandler(event:KeyboardEvent):void {
//down事件
switch (event.keyCode) {
//获取当前按键的keyCode进行匹配,如果是相应的4个按键则把状态数组中的值设为1
case 37 :
ddd[0]=1;
break;
case 38 :
ddd[1]=1;
break;
case 39 :
ddd[2]=1;
break;
case 40 :
ddd[3]=1;
break;
}
ax.text=ddd.toString();
//设置显示文本框里的内容
myKeyDownTest(ddd.join(""));
//把状态数组ddd合并成一个字符串并用myKeyDownTest函数进行检测类型。
}
function keyUpHandler(event:KeyboardEvent):void {
//up事件
switch (event.keyCode) {
//获取当前按键的keyCode进行匹配,如果是相应的4个按键则把状态数组中的值设为0
case 37 :
ddd[0]=0;
break;
case 38 :
ddd[1]=0;
break;
case 39 :
ddd[2]=0;
break;
case 40 :
ddd[3]=0;
break;
}
ax.text=ddd.toString();
//设置显示文本框里的内容
myKeyDownTest(ddd.join(""));
//把状态数组ddd合并成一个字符串并用myKeyDownTest函数进行检测类型。
}
function myKeyDownTest(k:String) {
//通过字符串检测来判断当前状态数组所反应的状态是哪种
//组合的话4个中取2个一共有15种组合,但是我们这里只需要其中的8种。
//以下代码是根据已知组合输出不同的结果(向显示文本输出不同状态文本),那些不需要的组合则不错处理。
switch (k) {
case "0110" :
ax.text = " 上+右";
break;
case "1100" :
ax.text = " 上+左";
break;
case "0011" :
ax.text = " 下+右";
break;
case "1001" :
ax.text = " 下+左";
break;
case "1010" :
ax.text = " 左+右";
break;
case "0101" :
ax.text = " 上+下";
break;
case "1000" :
ax.text = " 左";
break;
case "0100" :
ax.text = " 上";
break;
case "0010" :
ax.text = " 右";
break;
case "0001" :
ax.text = " 下";
break;
}
}