钮检测按键动作很有效,但是并不利于检测持续按下的键,所以不适合于制作某些通过键盘控制的游戏。
这时,您就需要用到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所示,可以通过键盘上的方向键控制影片剪辑运动。当敲击空格键时,瓢虫回到初始位置。
点击浏览该文件
图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属性,从而实现以键盘控制影片剪辑
第9章
输入文本和字符串
Flash中的文本形式有3种,即静态文本、动态文本和输入文本。输入文本可以接受用户输入,这也是响应键盘事件的一种。输入文本是一种人机交互工具,输入文本作为变量可以被ActionScript识别。
有许多方法可以操纵String(字符串)对象,如使用运算符“+”连接字符串,使用substring和substr函数从目标字符串中截取子字符串,使用indexOf函数确定匹配字符串在目标字符串中的位置等。
9.1 输入文本
Flash中的文本形式有3种,即静态文本、动态文本和输入文本。输入文本可以接受用户输入,这也是响应键盘事件的一种。
3种形式的文本都是由文本工具 创建的,要创建输入文本,首先要使用文本工具绘制一个文本框,然后在属性面板中将该文本框的类型设置成输入文本,如图9-1所示,与输入文本对应的属性面板如图9-2所示。
在输入文本的属性面板中,除可以设置一般的文本格式外,还可以单击 按钮将文本显示为HTML格式,单击 按钮为文本添加边框,在 后面的下拉列表框中设置文本的换行格式或将文本设置成密码显示。
输入文本最重要的是变量名,如图9-2所示中的“变量”文本框,其中的myInputText即是该输入文本的变量名。输入文本变量和其他变量类似,变量的值会呈现在输入文本框中,输入文本框中的值同时也作为输入文本变量的值,它们之间是等价的。
如在场景中绘制了一个变量名为myInputText的输入文本框,然后在主时间轴的帧动作面板中添加如下ActionScript:
Key.addListener(_r