AS3 KeyboardEvents не срабатывает до тех пор, пока я не нажму на экранную кнопку - PullRequest
2 голосов
/ 22 апреля 2011

Итак, вот мои настройки:

Мой класс документов - Main.as (он расширяет MovieClip).Следующий код находится в моем Main.as.

Я объявил все эти переменные в своем определении класса:

private var holder:MovieClip;
private var leftButton:SimpleButton;
private var rightButton:SimpleButton;

в конструкторе ...

holder = new MovieClip();
addChild(holder);
holder.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

leftButton = new Arrow();
rightButton = new Arrow();

holder.addChild(leftButton);
holder.addChild(rightButton);

leftButton.x = 50;
leftButton.rotation = 180;
rightButton.x = 150;

leftButton.y = rightButton.y = 50;

leftButton.addEventListener(MouseEvent.CLICK, handlePaging);
rightButton.addEventListener(MouseEvent.CLICK, handlePaging);

... за пределами конструктора ...

public function handleKeyboardEvent ( e:KeyboardEvent ) {
            trace("got a keyboard event");

                trace("e.charCode : " + e.charCode);
                trace("e.keyCode : " + e.keyCode);
                switch (e.keyCode) {
                    case 37: //left arrow
                        showPreviousMoment();
                        break;
                    case 39: //right arrow
                        showNextMoment();
                        break;
                }


        }

Две кнопки являются экземплярами мувиклипа Arrow, которые есть у меня в библиотеке.Мувиклип Arrow содержит только графику (в диалоговом окне свойств для него базовый класс - flash.display.SimpleButton).

Я хочу, чтобы пользователь мог нажимать экранные стрелки ИЛИ клавиши клавиатуры со стрелкамина страницу вперед и назад.

Итак ... когда я тестирую фильм или публикую его как приложение, нажатие левой и правой клавиш клавиатуры ничего не делает.ОДНАКО ... ПОСЛЕ ТОГО, КАК Я нажимаю на стрелки на экране, ТОГДА события клавиатуры накапливаются !!!Почему мои события клавиатуры не принимаются изначально?Почему при нажатии на экранные кнопки «держатель» начинает получать события?

ОБНОВЛЕНИЕ

Я также только что закомментировал весь мой код, КРОМЕ для создания экземпляра 'holder' и добавления слушателя.KeyboardEvents не прослушивается владельцем.

ОБНОВЛЕНИЕ ... ОТВЕТ

Итак, я обнаружил, что если я хочу глобально услышать KeyboardEvent, я должен зарегистрироватьсяэтап как слушатель.Так вот что сделали:

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

Информация из книги Колина Мука:

События ввода с клавиатуры, которые запускают команды всего приложения, обычно обрабатываются глобально слушателями, зарегистрированными в Flash.Экземпляр игрока.Напротив, события ввода с клавиатуры, которые инициируют определенный ответ элемента интерфейса, обычно обрабатываются слушателями, зарегистрированными с объектом, который в настоящее время имеет фокус клавиатуры.

Так что я предполагаю, что в моей первоначальной версии, когда ящелкнув по экранной кнопке со стрелкой, я как-то выделил фокусировку клавиатуры на держателе;.

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Обычно объект, на который вы щелкаете, получает фокус.Это действительно влияет на слушателей, поэтому оно работает, когда вы добавляете его на сцену.

Когда вы щелкаете по любому из них, ваш объект-держатель получает фокус, поэтому событие запускается.Теперь вы делаете это хорошо, что вы добавили его на сцену.

2 голосов
/ 28 ноября 2012

Более динамичное решение (скажем, если вы динамически создаете экземпляр класса, который содержит мувиклип) - это использовать:

stage.focus = this;

Так что, если вы примените прослушиватель событий к экземпляру класса, который фактически должен прослушивать ключевые события, это может работать лучше для вас.

Для меня предыдущие предложения не сработали, так как я добавлял свой экземпляр основного класса во время выполнения. В конце концов мой код выглядел так:

Main.singletron.stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyDown);
Main.singletron.stage.focus = this;

... вам нужно настроить синглетрон для этих двух строк.

0 голосов
/ 24 апреля 2011

Я публикую ответ на свой вопрос в соответствии с рекомендацией @Ascension Systems.Я просто копирую из своего обновления мой вопрос выше.

ОБНОВЛЕНИЕ ... ОТВЕТ

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

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent);

Информация из книги Колина Мука:

События ввода с клавиатуры, которые запускают команды всего приложения, обычно обрабатываются глобально слушателями, зарегистрированными в Flash.Экземпляр игрока.Напротив, события ввода с клавиатуры, которые инициируют определенный ответ элемента интерфейса, обычно обрабатываются слушателями, зарегистрированными с объектом, который в настоящее время имеет фокус клавиатуры.

Так что я предполагаю, что в моей первоначальной версии, когда ящелкнув по экранной кнопке со стрелкой, я как-то передал фокусировку на клавиатуре «держателю».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...