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 }
浙公网安备 33010602011771号