FLASH中键盘控制的实现

(整期优先)网络出版时间:2009-06-16
/ 2

FLASH中键盘控制的实现

方志广刘倩

摘要:FLASH中键盘控制多用于游戏制作上,现代对于游戏的开发空间越来越大,所以键盘控制越发显得重要了。键盘控制方法作为AS中的一个重要组成部分,在如今已经越来越广泛使用,而响应键盘的方法也就是主要的四种:利用按钮进行检测、利用KEY对象、利用键盘侦听的方法、利用影片剪辑的keyUp和keyDown事件来实现响应键盘。以实例加分析的方法解说键盘控制的实现。

关键词:键盘控制;KEY对象;键盘侦听;keyUp、keyDown事件1键盘控制的四种方法

1.1利用按钮进行检测

对于单键操作捕获键盘上按键的最好方法是利用按钮的KeyPress:同一时间只能捕获一个键,而且只能捕获0-9,a-z,A-Z,方向键,标点符号键,空格键,enter键,tab键,backspace键,delete键,insert键,home键,end键,pageup键,pagedown键在按钮的on事件处理函数中不但可以对鼠标事件作出响应,而且可以对键盘事件作出响应。如在按钮的动作面板中加入如下所示的代码,在敲击键盘上的X键时输出窗口中将提示:Xispressed

在按钮上加上:

on(keyPress"x"){

trace("Xispressed");}

但是要注意的是:检测键盘上的字母键时,字母都应为小写。如果要检测键盘中的特殊键,Flash中有一些专门的代码来表示它们:如要检测键盘上的键,可以使用下面的ActionScript:

on(keyPress""){

trace("Leftispressed");}

另外,你可以在一个按钮中加入若干个on函数,也可以在一个on函数中结合多种事件,这可以为按钮定义自己熟悉常用的快捷键,如下所示:

on(release,keyPress""){

_root.myMC.prevFrame();}

上面的语句实现单击按钮或按键盘上的左方向键,控制影片剪辑myMC回退1帧。

1.2利用KEY对象检测

利用按钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。

这时,您就需要用到Key对象。Key对象包含在动作面板的“对象”/“影片”目录下面,它由Flash内置的一系列方法、常量和函数构成。使用Key对象可以检测某个键是否被按下,如要检测左方向键是否被按下,可以使用如下ActionScript:

if(Key.isDown(Key.LEFT)){

trace("Theleftarrowisdown");}

函数Key.isDown返回一个布尔值,当该数中的参数对应的键被按下时返回true,否则返回false。常量Key.LEFT代表键盘上的左方向键。当左方向键被按下时,该函数返回true。

Key对象中的常量代表了键盘上相应的键,下面列出了一些基本的常量:

一些功能键的表示:

Key.BACKSPACEKey.ENTERKey.PGDN

Key.CAPSLOCKKey.ESCAPEKey.RIGHT

Key.CONTROLKey.HOMEKey.SHIFT

Key.DELETEKEYKey.INSERTKey.SPACE

Key.DOWNKey.LEFTKey.TAB

Key.ENDKey.PGUPKey.UP

以上是键盘上的功能键,那么如何表示键盘上的字母键呢?

Key对象提供了一个函数Key.getCode来实现这一功能,如下所示:

if(Key.isDown(Key.getCode("x"))){

trace("Xispressed");}

1.3利用键盘侦听的方法检测

假设在影片剪辑的onClipEvent(enterFrame)事件处理函数中检测按键动作,而影片剪辑所在的时间轴较长,或计算机运算速度较慢,就有可能出现这种情况:即当在键盘上按下某个键时还未来得及处理onClipEvent(enterFrame)函数,那么按键动作将被忽略,这样的话,很多你想要的效果就会无法实现了。

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

所以如果要解决这个问题,就需要用到键盘侦听的方法。可以使用“侦听器(listener)”来侦听键盘上的按键动作。要使用侦听器之前,首先需要创建它,可以使用如下所示的命令来告诉计算机你需要侦听某个事件:

Key.addListener(_root);

Key.addListener命令将主时间轴或某个影片剪辑作为它的参数,当侦听的事件发生时,可以用这个参数指定的对象来响应该事件。上面的代码指定主时间轴来响应该事件。要让主时间轴对该事件作出响应,还需要设置一个相应的事件处理函数,否则设置侦听器就没有什么意义了。

键盘侦听的事件处理函数有两个:onKeyUp和onKeyDown,如下所示:

Key.addListener(_root);

_root.onKeyUp=function(){

trace(Key.getAscii());};

也可以使用影片剪辑作为侦听键盘的对象,只需要使用影片剪辑的路径代替_root作为Key.addListener命令的参数就可以了。比如下面代码:

Key.addListener(_root.mc);

_root.mc.onKeyUp=function(){

trace(Key.getAscii());};

代码的意思是,当按下一个键并释放后,输出窗口将输出你按下的那个键的Ascii码,意思差不多,但是键盘侦听对象不同,一个是影片mc,一个是主时间轴。

1.4利用影片剪辑的keyUp和keyDown事件检测

最后一种方法很容易被忽视,但是也有一定的应用价值,最重要的是把概念弄清楚。影片剪辑包含两个与键盘相关的事件keyUp和keyDown,使用它们也可以实现对按键事件的响应。

例如下面的代码:

onClipEvent(keyDown){

trace(Key.getAscii());}

当按下键盘上的一个键的时候,输出窗口将输出按下的这个键的Ascii码值。

函数Key.getAscii表示返回与按键相对应的ASCII码,其中ASCII码是一个整数,键盘上的每个字符对应一个ASCII码,如字母A对应的ASCII码为65,B对应的ASCII码为66,a对应的ASCII码为97,b对应的ASCII码为98,+对应的ASCII码为43等。需要注意的是:只有字符键才有ASCII码,键盘上的功能键是没有ASCII码的。

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

onClipEvent(keyDown)

{trace(String.fromCharCode(Key.getAscii()));};

2单键操作和双键操作的补充说明

2.1单键操作和双键操作的执行判断

单键操作执行程序可以利用if……else……语句判断,其中一个条件符合,后面的条件就不再判断了。

双键操作和单键操作一样,唯一区别是:if条件语句有两组或两组以上key.isDwon()指令,以运算连接符连接,代表符合所有条件,程序才会执行。只要有一个按键按下就会执行,同时可以支持多个语句共同执行。Flash最多支持同时按下三个按钮。

2.2事件触发器的区别

捕获按键状态的key.isDown()可以利用enterframe,keydown,或keyup事件触发器。

Enterframe事件触发器适用于频繁的捕获按键,特别是按键按下不释放的情况。特别是在游戏中,按下向下键跑车会不断加速向前。

Keydown事件触发器适用于捕获按键,特别是按下不释放的情况,跟enterframe事件比较,使用频率低,没有按下任何键时,Enterframe事件触发器仍会不停监视键盘情况,keydown事件则不会。前者占用部分cpu资源,后者是则当有按键按下才会执行。

参考文献

[1]飞思科技产品研发中心.闪客实战-flash高级编程[M].北京:电子工业出版社.

[2]贾琳琳.flashmxprofessional2004中文版标准教程[M].北京:兵器工业出版社.

[3]COLINMOOCK著,赵声攀译.ACTIONSCRIPT权威指南[M].北京:机械工业出版社.