繁体   English   中英

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

[英]Problems getting keyboard input in AS3

因此,我在一个需要键盘输入的Flash项目中工作。 在该阶段中,有一个实例“ Car”,从上方可以看到该实例应该旋转并驱动旋转方向。 到目前为止,这是我在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;
    }

但是,当我运行该程序时,箭头键似乎没有任何作用。 对于“ onKeyDown”和“ onKeyUp”,我还会收到以下编译器警告:

迁移问题:onKeyDown事件处理程序不是由Flash Player在ActionScript 3.0中在运行时自动触发的。 您必须先使用addEventListener('keyDown',callback_handler)为事件注册此处理程序

尝试添加建议的内容只会导致错误,提示未定义callback_handler。 我现在一直想弄清楚如何使键盘输入正常工作。 有人知道吗

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

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 ,只需要this.RunGame即可,但是您会得到一个错误,该方法需要Event类型的参数,因此您的RunGame()定义应如下所示:

function RunGame(e:Event):void

然后,您将不会调用RunGame() ,而是将其绑定到事件侦听器时在每个帧中调用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM