событие клавиатуры as3 не работает - PullRequest
3 голосов
/ 03 октября 2011

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

По сутиошибка была в том, что я не получал событие клавиатуры из моей среды Flash Builder (та же ошибка / проблема видна с Adobe Flash CS5).Я установил stage.focus = stage, не помогло.Я добавил других слушателей событий (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");
    }
  }
}

Ответы [ 3 ]

3 голосов
/ 03 октября 2011

Использование команд клавиатуры требует прослушивания событий клавиатуры. Этот процесс идентичен процессу прослушивания любого другого события в AS3. Вам необходимо использовать метод addEventListener () для регистрации в KeyboardEvent . Однако, в отличие от других объектов, из-за того, что клавиатура необязательно прикреплена к какому-либо конкретному объекту в проекте, Событие клавиатуры обычно регистрируется на stage . В приведенном ниже коде объект 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 голосов
/ 03 октября 2011
public function init(stage:Stage):void 

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

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

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

1 голос
/ 03 октября 2011

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

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");
}
}

}
...