第8章 响应键盘
2008年07月23日 02:05:30 来源:教师自助餐网-汝明工作室

 有4种方法可以检测键盘上的按键动作。第1种方法是使用按钮,第2种方法是使用Key对象,第3种方法是使用键盘侦听,第4种方法是使用影片剪辑的keyUp和keyDown事件处理函数。


                        8.1 通过按钮检测按键动作
                        在按钮的on事件处理函数中不但可以对鼠标事件作出响应,而且可以对键盘事件作出响应。如在按钮的动作面板中加入如下所示的代码,在敲击键盘上的A键时输出窗口中将提示:A
                        is pressed。
                        on (keyPress "a") {
                        trace("A is pressed");
                        }
                        检测键盘上的字母键时,字母都应为小写。如果要检测键盘中的特殊键,如方向键,Flash中有一些专门的代码来表示它们,如表8-1所示。

                        表8-1 键盘中的特殊键
                        <Left> <Right> <Up> <Down> <Space>
                        <Home> <End> <Insert> <PageUp> <PageDown>
                        <Enter> <Delete> <Backspace> <Tab> <Escape>
                        如要检测键盘上的<End>键,可以使用下面的ActionScript:
                        on (keyPress "<End>") {
                        trace("End is pressed");
                        }
                        您可以在一个按钮中加入若干个on函数,也可以在一个on函数中结合多种事件,这使您可以为按钮定义快捷键,如下所示:

                        on (release, keyPress "<Left>") {
                        _root.myMC.prevFrame();
                        }
                        上面的语句实现单击按钮或按键盘上的左方向键,控制影片剪辑myMC回退1帧。
                        8.2 影片剪辑的keyUp和keyDown事件
                        影片剪辑包含两个与键盘相关的事件keyUp和keyDown,使用它们也可以实现对按键事件的响应,如下所示:
                        onClipEvent (keyDown) {
                        trace(Key.getAscii());
                        }
                        函数Key.getAscii返回与按键相对应的ASCII码。ASCII码是一个整数,键盘上的每个字符对应一个ASCII码,如字母A对应的ASCII码为65,B对应的ASCII码为66,a对应的ASCII码为97,
                        b对应的ASCII码为98,+对应的ASCII码为43等。只有字符才有ASCII码,键盘上的功能键没有ASCII码。

                        如果需要在输出窗口中输出与按键相对应的字符,可以使用String对象的fromCharCode函数将ASCII码转换成字符,如将上例的trace命令改成如下所示:

                        trace(String.fromCharCode(Key.getAscii()));
                        String对象见动作面板的“对象”/“核心”目录下面。
                        8.3 Key对象
                        利用按钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。
                        这时,您就需要用到Key对象。Key对象包含在动作面板的“对象”/“影片”目录下面,它由Flash内置的一系列方法、常量和函数构成。使用Key对象可以检测某个键是否被按下,如要检测左方向键是否被按下,可以使用如下ActionScript:

                        if (Key.isDown(Key.LEFT)) {
                        trace("The left arrow is down");
                        }
                        函数Key.isDown返回一个布尔值,当该数中的参数对应的键被按下时返回true,否则返回false。常量Key.LEFT代表键盘上的左方向键。当左方向键被按下时,该函数返回true。

                        Key对象中的常量代表了键盘上相应的键,如表8-2所示。
                        表8-2 Key对象中的常量
                        Key.BACKSPACE Key.ENTER Key.PGDN
                        Key.CAPSLOCK Key.ESCAPE Key.RIGHT
                        Key.CONTROL Key.HOME Key.SHIFT
                        Key.DELETEKEY Key.INSERT Key.SPACE
                        Key.DOWN Key.LEFT Key.TAB
                        Key.END Key.PGUP Key.UP
                        以上是键盘上的功能键,那么如何表示键盘上的字母键呢?Key对象提供了一个函数Key.getCode来实现这一功能,如下所示:

                        if (Key.isDown(Key.getCode("a"))) {
                        trace("A is pressed");
                        }
                        8.4 键盘侦听
                        假设在影片剪辑的onClipEvent(enterFrame)事件处理函数中检测按键动作,而影片剪辑所在的时间轴较长,或计算机运算速度较慢,有可能出现这种情况,即当在键盘上按下某个键时还未来得及处理onClipEvent(enterFrame)函数,那么按键动作将被忽略。

                        还有一个问题就是,在某些游戏(如射击)中,我们需要按一次键就执行一次动作(发射一发子弹),即使长时间按住某个键不放也只能算作一次按键,而Key对象并不能区别是长时间按住同一个键还是快速地多次按键。

                        在解决这个问题,就需要用到Flash MX中的第3种方法:键盘侦听。when it comes to
                        listening for key presses您可以使用
                        “侦听器(listener)”来侦听键盘上的按键动作。
                        要使用侦听器首先需要创建它,您可以使用如下所示的命令来告诉计算机您需要侦听某个事件:
                        Key.addListener(_root);
                        Key.addListener命令将主时间轴或某个影片剪辑作为它的参数,当侦听的事件发生时可以用这个参数指定的对象来响应该事件。

                        上面的代码指定主时间轴来响应该事件。要让主时间轴对该事件作出响应,还需要设置一个相应的事件处理函数。
                        键盘侦听的事件处理函数有两个:onKeyUp和onKeyDown,如下所示:
                        _root.onKeyUp = function() {
                        trace(Key.getAscii());
                        };
                        您也可以使用影片剪辑作为侦听键盘的对象,只需要使用影片剪辑的路径代替_root作为Key.addListener命令的参数。

                        8.5 练习:键盘控制影片剪辑
                        文件如图8-1所示,可以通过键盘上的方向键控制影片剪辑运动。当敲击空格键时,瓢虫回到初始位置。
                        文件ladybug.fla,其中包含了一个影片剪辑ladybug。在主场景中选中瓢虫影片剪辑,打开其动作面板,其中添加了如下ActionScript:

                        onClipEvent (load) {
                        x0 = this._x;
                        y0 = this._y;
                        }
                        onClipEvent (enterFrame) {
                        if (Key.isDown(Key.SPACE)) {
                        this._x = x0;
                        this._y = y0;
                        this._rotation = 0;
                        }
                        if ((Key.isDown(Key.LEFT)) && (Key.isDown(Key.UP))) {
                        this._x -= 10/Math.SQRT2;
                        this._y -= 10/Math.SQRT2;
                        this._rotation = -45;
                        } else if ((Key.isDown(Key.LEFT)) &&
                        (Key.isDown(Key.DOWN))) {
                        this._x -= 10/Math.SQRT2;
                        this._y += 10/Math.SQRT2;
                        this._rotation = -135;
                        } else if ((Key.isDown(Key.RIGHT)) &&
                        (Key.isDown(Key.UP))) {
                        this._x += 10/Math.SQRT2;
                        this._y -= 10/Math.SQRT2;
                        this._rotation = 45;
                        } else if ((Key.isDown(Key.RIGHT)) &&
                        (Key.isDown(Key.DOWN))) {
                        this._x += 10/Math.SQRT2;
                        this._y += 10/Math.SQRT2;
                        this._rotation = 135;
                        } else if (Key.isDown(Key.LEFT)) {
                        this._x -= 10;
                        this._rotation = -90;
                        } else if (Key.isDown(Key.RIGHT)) {
                        this._x += 10;
                        this._rotation = 90;
                        } else if (Key.isDown(Key.UP)) {
                        this._y -= 10;
                        this._rotation = 0;
                        } else if (Key.isDown(Key.DOWN)) {
                        this._y += 10;
                        this._rotation = 180;
                        }
                        if (this._x>550) {
                        this._x = 0;
                        }
                        if (this._x<0) {
                        this._x = 550;
                        }
                        if (this._y>400) {
                        this._y = 0;
                        }
                        if (this._y<0) {
                        this._y = 400;
                        }
                        }
                        当敲击空格键(Key.isDown(Key.SPACE))时,影片剪辑回到初始位置;当敲击不同的方向键或方向键组合时,相应调整影片剪辑的_x、_y和_rotation属性,从而实现以键盘控制影片剪辑。

 

讨论区
我要评论
匿名
Copyright 2006-2008 zrm.cn21edu.com , All Rights Reserved
中华人民共和国电信经营许可证 京ICP证060563
教师自助餐网-汝明工作室版权所有
中国现代教育网提供技术支持 违法和不良信息举报中心
联系地址:广饶县稻庄镇实验中学,联系电话:13371518500