В отличие от AS2, в AS3 события клавиатуры не являются глобальными. Они выдаются на сцену, и они пролистывают список отображения к любому экранному объекту, который имеет фокус. В вашем коде ваш прослушиватель событий добавляется к mainGame
, поэтому он будет срабатывать только тогда, когда mainGame
находится на сцене, а пользователь щелкнул (или забыл мышью, я забыл) фильм mainGame
клип.
Когда вы хотите получать события клавиатуры в глобальном масштабе, как я уже сказал, все они начинаются со стадии до появления пузырьков, поэтому, если вы зарегистрируетесь для событий со сценой, вы получите все события клавиатуры. Итак, как сказал Кекоав, способ сделать это -
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
Однако ваша проблема в том, что stage
в этом коде не является глобальной переменной. Это свойство является общим для всех объектов DisplayObject, но оно равно нулю, пока объект не будет добавлен в список отображения.
Таким образом, чтобы обойтись без объяснений, приведенный выше код будет работать, если вы позвоните ему после того, как mainGame
был добавлен на сцену. Если у вас нет простого способа сделать это, вы можете добавить свой слушатель клавиатуры внутри другого слушателя, который знает, когда нужно запустить:
function mainGame():void {
//...
addEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
//...
}
private function stageAddHandler(e:Event):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
}