Flash/Flex学习笔记(17):按键捕获

先来看简单的单个按键捕获:

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
}

原文地址:https://www.cnblogs.com/happysky97/p/1884511.html