• 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
    }

  • 相关阅读:
    Blob格式数据处理以及DataTable问题处理
    JavaScript 与 jQuery-简记
    JFinal-学习笔记(下)
    JFinal学习笔记
    工作记录
    读书笔记——计算机科学导论
    面试经验大全
    如何在liunx系统发布项目
    面试必备
    最全面的测试用例
  • 原文地址:https://www.cnblogs.com/happysky97/p/1884511.html
Copyright © 2020-2023  润新知