做游戏的时候需要用到响应键盘行为。一般的单纯键盘侦听可能不能满足我们的使用。先放个普通的键盘侦听。
package
{
import flash.display.Sprite;
import flash.events.KeyboardEvent;
public class commomKeyboard
extends Sprite
{
public
function commomKeyboard()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
}
private
function onKeyDown(evt:KeyboardEvent):void{
trace(evt.keyCode);
}
}
}
复制代码那是很直接地检测按下什么键,抬起什么键。
但注意了,像这样单纯的键盘侦听,当按键不松开的话,不会立刻连续响应。会像我们在聊天窗口或者其他输入栏一样,先出现一个,然后停顿一会,才会连续出现。就像上面的trace语句,先是输出一个keyCode,然后稍微停顿,再连续输出。
为什么呢,因为这是系统的行为,为了防止人们使用键盘时多按了,而这样键盘侦听,也是直接侦听系统键盘信息。所以就会出现这种情况。
这样的话做一些游戏会感到很不爽,好像角色不能迅速响应。最要命的是,这样的侦听不能八方向移动。
怎么解决呢?只要我们稍微绕一下。例如,声明一个变量,当侦听的键值Down时,变量为true,否则为false。然后在人物那里判断那个变量是否为true就行了。
Control类代码如下。
package
{ import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
public class Control
extends Sprite
{
private
static var code:uint;
private
static var KeyAry:Array = new Array();
public
static function init(stage:Stage):void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,
onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP,
onKeyUp);
}
private
static function onKeyDown(evt:KeyboardEvent):void
{
code
= evt.keyCode;
trace("按下了"
+ code);
KeyAry[code]
= true;
}
private
static function onKeyUp(evt:KeyboardEvent) :void
{
KeyAry
= [];//全部设置为FALSE,这样的目的是为了防止同时按下两个键的时候,最后只置了一个键位FALSE
}
public
static function isDown(KeyCode:uint):Boolean
{
return
KeyAry[KeyCode] == true;
}
}
}
复制代码全场都是静态函数。稍微分析一下吧。声明了code,uint类型(其实这个可有可无),和KeyAry数组
当键盘按下时,KeyAry数组的第键盘码个元素(=
=)就被赋值为true,然后在isDown处返回那个元素是否为true。
在另一边,角色就得到那个元素是否为true了。
代码如下。
package
{
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
public class rectObj
extends Sprite
{
private
var rect:Shape = new Shape();
public
function rectObj()
{
drawRect();
addChild(rect);
this.addEventListener(Event.ENTER_FRAME,EnterFrameHandler);
}
private
function drawRect():void
{
var
g:Graphics = rect.graphics;
g.beginFill(0xFF0000);
g.drawRect(0,0,50,50);
g.endFill();
}
public
function EnterFrameHandler(evt:Event):void
{
//w-87,s-83,a-65,d-68
if(Control.isDown(87))
rect.y -= 5;
if(Control.isDown(83))
rect.y += 5;
if(Control.isDown(65))
rect.x -= 5;
if(Control.isDown(68))
rect.x +=5;
}
}
}
复制代码在EnterFrame里判断键盘是否被按下。不断调用Control类的isDown函数返回。