Flash/Flex学习笔记(17):按键捕获
时间:2010-11-22 来源:模西的哥哥
view source
print?
01
package {
02
import flash.display.Sprite;
03
import fl.controls.Label;
04
import flash.events.KeyboardEvent;
05
import flash.ui.Keyboard;
06
07
public class KeyDown extends Sprite {
08
09
private var lbl:Label;
10
private var ball:Sprite;
11
12
public function KeyDown():void {
13
init();
14
}
15
16
private function init():void {
17
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
18
19
lbl = new Label();
20
lbl.text="请按键,这里将显示您的按键值,按方向键可以移动小球";
21
lbl.autoSize="center";
22
addChild(lbl);
23
lbl.width=stage.stageWidth;
24
lbl.height=20;
25
lbl.move(0,10);
26
27
ball = new Sprite();
28
addChild(ball);
29
30
//画小球
31
ball.graphics.beginFill(0xff0000);
32
ball.graphics.drawCircle(0,0,30);
33
ball.graphics.endFill();
34
35
//定位到舞台中心
36
ball.x=stage.stageWidth/2;
37
ball.y=stage.stageHeight/2;
38
39
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
40
}
41
42
public function KeyDownHandler(e:KeyboardEvent):void {
43
lbl.text="您的按键值是:"+e.keyCode.toString()+";按键是:"+String.fromCharCode(e.keyCode);
44
switch (e.keyCode) {
45
case Keyboard.UP :
46
ball.y-=10;
47
break;
48
case Keyboard.DOWN :
49
ball.y+=10;
50
break;
51
case Keyboard.LEFT :
52
ball.x-=10;
53
break;
54
case Keyboard.RIGHT :
55
ball.x+=10;
56
default :
57
break;
58
}
59
60
if (e.ctrlKey) {
61
lbl.text="您按下了Ctrl键!";
62
}
63
if (e.shiftKey) {
64
lbl.text="您按下了Shift键!";
65
}
66
//注:实际上,在很多浏览器,包括flash播放器里,Alt都是默认用做菜单激活键的,所以Alt键会被他们拦截,从而导致Flash无法捕获
67
if (e.altKey) {
68
lbl.text="您按下了Alt键!";
69
}
70
}
71
}
72
}
再来看下类似: A + B + C 的这种组合键捕获:
先分析一下过程,比如用户按下Ctrl + A 时,实际上是先按下Ctrl键,同时触发KeyDown事件,然后在Ctrl不放的同时,再按下A键,再次触发KeyDown事件,然后松开(触发KeyUp事件),这是一个顺序的过程。
思路:在用户按下键且尚未松开任何键时,可以考虑用一个数据,把本次按下的所有的键值都存储起来,然后等待用户松开,一旦松开,就可以认为本次组合键 输入完成,这时再清空数据,准备下次使用,这样数组中保存的就是用户按下的组合键。
按这个思路把上面的代码改进一下:
view source
print?
01
package {
02
import flash.display.Sprite;
03
import fl.controls.Label;
04
import flash.events.KeyboardEvent;
05
import flash.ui.Keyboard;
06
import flash.ui.*;
07
08
public class KeyDown extends Sprite {
09
10
private var lbl:Label;
11
private var ball:Sprite;
12
private var keyValueArr:Array;//捕获组合键时,用来存放本次(在未触KeyUp事件前)所有按下的所有键值
13
private var keyNameArr:Array;//按键值对应的字符
14
15
public function KeyDown():void {
16
init();
17
}
18
19
private function init():void {
20
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
21
22
lbl = new Label();
23
lbl.text="请按键(支持Ctrl,Shift组合键),这里将显示您的按键值,按方向键可以移动小球";
24
lbl.autoSize="center";
25
addChild(lbl);
26
lbl.width=stage.stageWidth;
27
lbl.height=20;
28
lbl.move(0,10);
29
30
ball = new Sprite();
31
addChild(ball);
32
33
//画小球
34
ball.graphics.beginFill(0xff0000);
35
ball.graphics.drawCircle(0,0,30);
36
ball.graphics.endFill();
37
38
//定位到舞台中心
39
ball.x=stage.stageWidth/2;
40
ball.y=stage.stageHeight/2;
41
42
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
43
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);
44
45
keyValueArr = new Array();
46
keyNameArr = new Array();
47
}
48
49
public function KeyDownHandler(e:KeyboardEvent):void {
50
//注:既然Alt总是被浏览器或播放器菜单栏 拦截,干脆就不检测了
51
if (!(e.keyCode==Keyboard.SHIFT||e.keyCode==Keyboard.CONTROL)) {
52
keyValueArr.push(e.keyCode);
53
keyNameArr.push(String.fromCharCode(e.keyCode));
54
}
55
56
lbl.text="您的按键值是:" + e.keyCode.toString()+";按键是:" + String.fromCharCode(e.keyCode);
57
switch (e.keyCode) {
58
case Keyboard.UP :
59
ball.y-=10;
60
break;
61
case Keyboard.DOWN :
62
ball.y+=10;
63
break;
64
case Keyboard.LEFT :
65
ball.x-=10;
66
break;
67
case Keyboard.RIGHT :
68
ball.x+=10;
69
default :
70
break;
71
}
72
73
if (e.ctrlKey) {
74
if (keyValueArr.length>0) {
75
lbl.text="您按下了Ctrl + "+keyNameArr.join(',');
76
}
77
}
78
if (e.shiftKey) {
79
if (keyValueArr.length>0) {
80
lbl.text="您按下了Shift + "+keyNameArr.join(',');
81
}
82
}
83
84
}
85
86
public function KeyUpHandler(e:KeyboardEvent):void {
87
keyValueArr.length=0;
88
keyNameArr.length=0;
89
}
90
}
91
}
最后再来看看所谓的"八方向"移动:很多小游戏都可以用方向键控制人物的移动方向,上面的示例中,只能沿水平垂直四个方向移动,如果要做到8方向移动,就要用到组合键,仍然在上面的代码基本上做些修改:
view source
print?
001
package {
002
import flash.display.Sprite;
003
import fl.controls.Label;
004
import flash.events.KeyboardEvent;
005
import flash.ui.Keyboard;
006
import flash.ui.*;
007
008
public class KeyDown extends Sprite {
009
010
private var lbl:Label;
011
private var ball:Sprite;
012
private var keyValueArr:Array;//捕获组合键时,用来存放本次(在未触KeyUp事件前)所有按下的所有键值
013
private var keyNameArr:Array;//按键值对应的字符
014
015
public function KeyDown():void {
016
init();
017
}
018
019
private function init():void {
020
stage.focus=this;//N多资料上说要先设置焦点,但是在实际测试中,发现不加这一行,好象也能处理键盘事件?
021
022
lbl = new Label();
023
lbl.text="请按键(支持Ctrl,Shift组合键),这里将显示您的按键值,按方向键可以移动小球(支持8方向)";
024
lbl.autoSize="center";
025
addChild(lbl);
026
lbl.width=stage.stageWidth;
027
lbl.height=20;
028
lbl.move(0,10);
029
030
ball = new Sprite();
031
addChild(ball);
032
033
//画小球
034
ball.graphics.beginFill(0xff0000);
035
ball.graphics.drawCircle(0,0,30);
036
ball.graphics.endFill();
037
038
//定位到舞台中心
039
ball.x=stage.stageWidth/2;
040
ball.y=stage.stageHeight/2;
041
042
stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);
043
stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);
044
045
keyValueArr = new Array();
046
keyNameArr = new Array();
047
}
048
049
public function KeyDownHandler(e:KeyboardEvent):void {
050
//注:既然Alt总是被浏览器或播放器菜单栏 拦截,干脆就不检测了
051
if (!(e.keyCode==Keyboard.SHIFT||e.keyCode==Keyboard.CONTROL)) {
052
if (keyValueArr.indexOf(e.keyCode)==-1) {
053
keyValueArr.push(e.keyCode);
054
keyNameArr.push(String.fromCharCode(e.keyCode));
055
}
056
}
057
058
lbl.text="您的按键值是:"+ keyValueArr.join(',') +";按键是:" + keyNameArr.join(',');
059
060
//单方向移动
061
if (keyValueArr.length==1) {
062
switch (e.keyCode) {
063
case Keyboard.UP :
064
ball.y-=10;
065
break;
066
case Keyboard.DOWN :
067
ball.y+=10;
068
break;
069
case Keyboard.LEFT :
070
ball.x-=10;
071
break;
072
case Keyboard.RIGHT :
073
ball.x+=10;
074
default :
075
break;
076
}
077
} else if (keyValueArr.length>1) {
078
//trace(keyValueArr.join(','));
079
if (keyValueArr.indexOf(Keyboard.UP)!=-1 && keyValueArr.indexOf(Keyboard.LEFT)!=-1) {
080
//左上
081
ball.x -= 10;
082
ball.y -= 10;
083
} else if (keyValueArr.indexOf(Keyboard.UP)!=-1 && keyValueArr.indexOf(Keyboard.RIGHT)!=-1) {
084
//右上
085
ball.x += 10;
086
ball.y -= 10;
087
}
088
else if (keyValueArr.indexOf(Keyboard.DOWN)!=-1 && keyValueArr.indexOf(Keyboard.RIGHT)!=-1) {
089
//右下
090
ball.x += 10;
091
ball.y += 10;
092
}
093
else if (keyValueArr.indexOf(Keyboard.DOWN)!=-1 && keyValueArr.indexOf(Keyboard.LEFT)!=-1) {
094
//左下
095
ball.x -= 10;
096
ball.y += 10;
097
}
098
}
099
100
if (e.ctrlKey) {
101
if (keyValueArr.length>0) {
102
lbl.text="您按下了Ctrl + "+keyNameArr.join(',');
103
}
104
}
105
if (e.shiftKey) {
106
if (keyValueArr.length>0) {
107
lbl.text="您按下了Shift + "+keyNameArr.join(',');
108
}
109
}
110
111
}
112
113
public function KeyUpHandler(e:KeyboardEvent):void {
114
keyValueArr.length=0;
115
keyNameArr.length=0;
116
}
117
}
118
}