Просмотр полной версии : Не работает KeyboardEvent
Здравствуйте.
Уже второй день бьюсь с каким-то не понятным мне глюком.
Код:
private function start_game(level)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,hero_fly);
function hero_fly(e:KeyboardEvent):void
{
trace("asdas");
switch (e)
{
...
Запускаю - trace ничего не выводит при нажатии на клавиши. Функция hero_fly - не запускается.
библиотеки KeyboardEvent и Event - подключены.
Вставляю этот код в основной as файл - работает. Пишу в классе Main - не работает.
В чём может быть причина?
Deimos747
25.04.2013, 15:33
Проблема в том, что на объекте нет фокуса. Если вам нужен обработчик, который будет работать всегда, то подписывайтесь к stage приложения.
Проблема в том, что на объекте нет фокуса. Если вам нужен обработчик, который будет работать всегда, то подписывайтесь к stage приложения.
Нет, мне не нужен обработчик, который будет работать всегда.
Я правильно вас понял, что нужно фокус переместить на мувик, действия в котором мне нужно отслеживать?
Если это так, буду благодарен за пример.
chamele0n
25.04.2013, 15:37
Вставляю этот код в основной as файл - работает.
тоесть fla ?
вешай слушатели в конструкторе главного класа
public function Main() {
stage.addEventListener(KeyboardEvent.KEY_DOWN,hero_fly);
.....
Deimos747
25.04.2013, 15:42
Вешайте обработчик на Main.instance.stage.addEventListener(KeyboardEvent.KEY_DOWN,hero_fly); где в Main.aspublic static var instance: Main;
public function Main() {
instance = this;
.....
}
"Main.instance.stage" — зло.
Deimos747
25.04.2013, 16:00
"Main.instance.stage" — зло. Не спорю, но другого простого способа не знаю. Написание KeyboardManager не в счёт.
carrotoff
25.04.2013, 16:06
но другого простого способа не знаю
Сделать что? иметь постоянную ссылку на Main или stage?
Для второго варианта любой экранный объект будет иметь на него ссылку после добавления на сцену.
Вообще не вижу необходимости в такой конструкции
Не спорю, но другого простого способа не знаю. Написание KeyboardManager не в счёт.
Что такое KeyboardManager ?
И эм...
Я не против "философских диспутов", но у меня тут код не работает. И что самое печальное - я никак не могу понять - почему?
Растолкуйте уж топикстартеру, пожалуйста.
Да и не работает у меня main.instance
Ошибку выдаёт компиллятор.
Deimos747
25.04.2013, 16:29
Напишите в главном классе аналогичный кодpublic static var instance: Main;
public function Main() {
instance = this;
.....
}
Напишите в главном классе аналогичный код
Я не так делал, да и не суть важно уже.
Решил сделать с помощью focus
private function start_game(level)
{
stage.focus=this;
addEventListener(KeyboardEvent.KEY_DOWN,hero_fly);
function hero_fly(e:KeyboardEvent):void
{
switch (e)
{
case Keyboard.UP :
{
trace("asdas");
y -= 5;
break;
}
}
}
};
Обращение к функции hero_fly пошло, но перебор нажатых клавиш почему-то не работает.
trace не выводит ничего. :(
AlexLucas
25.04.2013, 17:38
Ваш код в первом сообщении должен нормально работать, скорее проблема в том что сама функция start_game не вызывается. Ну и лучше отдельно объявите hero_fly.
Что касается вашего последнего поста - а если этот ваш объект опять потеряет фокус ? Будете каждый раз вручную задавать stage.focus=this; ?
Хотя я понятия не имею о том что и как у вас устроено в приложении, может и не потеряет.
Bletraut
25.04.2013, 17:56
На объекте просто фокуса нет. Зачем так извращаться через instanse и прочее херню с передачей ссылок? Есть же хорошее событие, пишешь прям в том классе где слушатель вешаешь
this.addEventListener(Event.ADDED_TO_STAGE, onKeyStage);
private function onKeyStage(e:Event):void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,hero_fly);
}
function hero_fly(e:KeyboardEvent):void
{
trace("asdas");
switch (e)
{
...
Все работать будет.
Там есть (была во всяком случае) багофитча флешплеера:
Если фокус был на спрайте, который снесли из списка отображения - фокуса нет нигде (и пока не кликнешь по флешке - никакие кнопки на стейдже не поймаешь)
Решение:
При старте вешаем вечный слушатель ENTER_FRAME на stage.
Проверяем в слушателе stage.focus и если stage.focus == null, то делаем stage.focus = stage.
Спасибо всем.
Решил через наведение фокуса на уровень, в котором идёт игра.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.