Flash/Flex学习笔记(17):按键捕获
先来看简单的单个按键捕获:
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事件),这是一个顺序的过程。
思路:在用户按下键且尚未松开任何键时,可以考虑用一个数据,把本次按下的所有的键值都存储起来,然后等待用户松开,一旦松开,就可以认为本次组合键 输入完成,这时再清空数据,准备下次使用,这样数组中保存的就是用户按下的组合键。
按这个思路把上面的代码改进一下:
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方向移动,就要用到组合键,仍然在上面的代码基本上做些修改:
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
}