【问题标题】:Problems getting keyboard input in AS3在 AS3 中获取键盘输入的问题
【发布时间】:2026-02-08 19:30:01
【问题描述】:

所以我正在开发一个需要键盘输入的 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;
    }

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

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

尝试添加它所建议的内容只会产生错误,说 callback_handler 未定义。 我现在一直在试图弄清楚如何使键盘输入起作用。有人知道吗?

【问题讨论】:

    标签: actionscript-3 flash input keyboard


    【解决方案1】:

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

    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(),它在绑定到事件监听器的同时每帧都会调用。

    编辑:请注意,有很多方法可以处理关键事件,我的回答将适用于您当前的实现。

    【讨论】: