Actionscript 3 在AS3中获取键盘输入时出现问题

Actionscript 3 在AS3中获取键盘输入时出现问题,actionscript-3,flash,input,keyboard,Actionscript 3,Flash,Input,Keyboard,所以我在做一个flash项目,在那里我需要键盘输入。在这个阶段,有一个实例“汽车”,从上面看,应该是旋转和驱动旋转方向。这是我到目前为止在AS3中总结的内容: //Required stuff import flash.ui.Keyboard; import flash.events.Event; import flash.events.KeyboardEvent; import flash.display.Stage; import flash.disp

所以我在做一个flash项目,在那里我需要键盘输入。在这个阶段,有一个实例“汽车”,从上面看,应该是旋转和驱动旋转方向。这是我到目前为止在AS3中总结的内容:

//Required stuff
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.display.Stage;
    import flash.display.MovieClip;

    Car.addEventListener(Event.ENTER_FRAME, this.RunGame);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
    stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

//Variables
    var keys:Array = []

var vDrive:Number = 3; //Car's current base speed
    var vx:Number = 0; //Speed along x axis
var vy:Number = 0; //Speed along y axis

var vMax:Number = 30; //Top speed
var vRot:Number = 3; //Rotation speed

var vAcc:Number = 1.1; //Factor for acceleration
var vDeAcc:Number = 0.90; //Factor for de-acceleration


//Game Loop
    RunGame();

function RunGame():void 
    {

   // Drive forwards
      if (keys[Keyboard.UP]) 
          {
          if (vDrive < vMax)
            vDrive += vAcc;
          }


       // Reverse
    if (keys[Keyboard.DOWN])
        {
        if (vDrive > vMax)
            vDrive *= vAcc;
        }

   // Turn right
    if (keys[Keyboard.RIGHT])
        {
        Car.rotation += vRot;
        }

   // Turn left venstre
    if (keys[Keyboard.LEFT])
        {
        Car.rotation -= vRot;
        }

   //Movement
        // Friction
            vDrive *= vDeAcc;

        //Calculating movement vector
            vx = vDrive * Math.cos(toRad(Car.rotation));
            vy = vDrive * Math.sin(toRad(Car.rotation));

        //Update car position
            Car.x -= vx ;
            Car.y -= vy;
    }
//必需的东西
导入flash.ui.Keyboard;
导入flash.events.Event;
导入flash.events.KeyboardEvent;
导入flash.display.Stage;
导入flash.display.MovieClip;
Car.addEventListener(Event.ENTER_FRAME,this.RunGame);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
stage.addEventListener(KeyboardEvent.KEY\u UP,onKeyUp);
//变数
变量键:数组=[]
var vDrive:Number=3//汽车当前的基本速度
变量vx:数值=0//沿x轴的速度
变量vy:Number=0//沿y轴的速度
var vMax:数值=30//最高速度
var vRot:数值=3//转速
var vAcc:数值=1.1//加速系数
var vDeAcc:数值=0.90//减速系数
//游戏循环
RunGame();
函数RunGame():void
{
//向前行驶
if(键[Keyboard.UP])
{
如果(vDrivevMax)
vDrive*=vAcc;
}
//右转
if(键[键盘右])
{
Car.rotation+=vRot;
}
//向左转文斯特
if(键[键盘左])
{
Car.rotation-=vRot;
}
//运动
//摩擦
vDrive*=vDeAcc;
//计算运动矢量
vx=vDrive*Math.cos(toRad(汽车旋转));
vy=vDrive*Math.sin(toRad(汽车旋转));
//更新汽车位置
Car.x-=vx;
Car.y-=vy;
}
然而,当我运行程序时,箭头键似乎什么都不起作用。 对于“onKeyDown”和“onkeydup”,我还收到以下编译器警告:

迁移问题:未触发onKeyDown事件处理程序 在ActionScript 3.0的运行时由Flash Player自动执行。你 必须首先使用addEventListener为事件注册此处理程序 ('keyDown',回调处理程序)

尝试添加它所建议的内容只会导致错误,说明回调处理程序未定义。
我现在被困在试图找出如何使键盘输入工作。有人知道吗?

您当前缺少关键侦听器的功能。您已在此处将侦听器添加到舞台:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
现在,您只需创建以下函数:

function onKeyDown( e:KeyboardEvent ):void {
    //add our key to the keys array
    keys[e.keyCode] = e.keyCode;
}

function onKeyUp( e:KeyboardEvent ):void {
    //if the key is in the keys array, set the value to null
    keys[e.keyCode] = null;
}
但这里还有另一个问题:

Car.addEventListener(Event.ENTER_FRAME, this.RunGame);
您不需要
this.RunGame
,只需要RunGame就可以了,但是您应该得到一个错误。此方法需要一个
Event
类型的参数,因此您的
RunGame()
定义应该如下所示:

function RunGame(e:Event):void
那么您就不会调用
RunGame()
,它在绑定到事件侦听器时会在每个帧中调用

编辑:请注意,有许多方法可以处理关键事件,我的答案将与您当前的实现一起使用