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