событие клавиатуры as3 не работает

#flash #actionscript-3 #actionscript #flash-builder #flash-cs5

#вспышка #actionscript-3 #actionscript #flash-builder #flash-cs5

Вопрос:

Это было то, из-за чего я бился головой в течение 2 часов, прежде чем понял это.
Я решил опубликовать его здесь, чтобы помочь другим не рвать на себе волосы :).

По сути, ошибка заключалась в том, что я не получал событие клавиатуры из своей среды flash Builder (та же ошибка / проблема видна в Adobe flash cs5). Я подготовил почву.фокус = этап, не помогло. Я добавил другие прослушиватели событий (mouse_down, frame_enter), которые работали нормально, я добавил дочерние элементы MovieClip и прослушал события для этих дочерних элементов, все та же проблема.

 package
{
  public class Test extends Sprite 
  {

    public function Test() 
    {
        this.addEventListener(Event.ADDED_TO_STAGE,init);
    }

    public function init(stage:Stage):void 
    {
        this.removeEventListener(Event.ADDED_TO_STAGE,init);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
    }


    private function keyPressed(e:KeyboardEvent):void 
    {
        trace("keyPressed");
    }

    private function keyReleased(e:KeyboardEvent):void 
    {
        trace("keyReleased");
    }
  }
}
  

Комментарии:

1. Этот код работает или не работает?

2. Этот код НЕ работал, точно так, как указано выше. Вопрос был в том, ПОЧЕМУ это не работает. Я, наконец, понял это, разместив вопрос здесь, чтобы другие могли ответить (или я в конечном итоге отвечу на него сам). Подсказка, окружающая среда была причиной ошибки.

Ответ №1:

Использование команд клавиатуры требует прослушивания событий клавиатуры. Этот процесс идентичен процессу прослушивания любого другого события в AS3. Для регистрации в KeyboardEvent необходимо использовать метод addEventListener(). Однако, в отличие от других объектов, из-за того, что клавиатура не обязательно привязана к какому-либо конкретному объекту в проекте, событие клавиатуры обычно регистрируется на этапе. В приведенном ниже коде объект stage регистрирует событие клавиатуры, которое будет запускаться при каждом нажатии клавиши клавиатуры.

В отличие от AS2, в AS3 события клавиатуры не являются глобальными. Они выводятся на сцену и перемещаются по списку отображения к любому отображаемому объекту, имеющему фокус.

 package
{
import flash.display.*;
import flash.events.*;

  public class Test extends Sprite 
  {
   public function Test() 
   {
     init();
   }

   public function init():void 
   {
      stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
      stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
   }


   private function keyPressed(e:KeyboardEvent):void 
   {
      trace("keyPressed");
   }

   private function keyReleased(e:KeyboardEvent):void 
   {
    trace("keyReleased");
   }
  }
}
  

Ответ №2:

 public function init(stage:Stage):void 

ADDED_TO_STAGE is a `listener Event` not a stage instance. 
  

поэтому вместо stage:Stage использования event:Event .

и u необходимо импортировать необходимые классы.

Ответ №3:

Помечена строка, которая изменилась. Кстати, ваш код не компилируется, проверьте журналы ошибок.

 package  {

import flash.display.Sprite; /// changed line
import flash.events.Event; /// changed line
import flash.events.KeyboardEvent; /// changed line


public class Test extends Sprite 
{

public function Test() 
{
    this.addEventListener(Event.ADDED_TO_STAGE,init);
    /* i like it this way
    stage ? init(null) : addEventListener(Event.ADDED_TO_STAGE,init);
    */

}

public function init(e:Event):void  /// changed line
{
    this.removeEventListener(Event.ADDED_TO_STAGE,init);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
}


private function keyPressed(e:KeyboardEvent):void 
{
    trace("keyPressed");
}

private function keyReleased(e:KeyboardEvent):void 
{
    trace("keyReleased");
}
}

}