Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема со слушателем клавиатуры (http://www.flasher.ru/forum/showthread.php?t=141551)

Triton36 28.06.2010 14:08

Проблема со слушателем клавиатуры
 
Вложений: 1
Всем добрый день.
Собственно изучаю AS3 на основе нескольких скачаных уроков, в процессе создания приложения вылезла ошибка. Исходник прилагается.
Суть ошибки - в файле keys.as в строках 10-11 не знаю как правильно подойти к прослушивателям событий, ибо первоначальный вариант(оставил в комментариях к коду) со stage выдаёт null(точнее Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null").

КорДум 28.06.2010 15:03

Ну, как бы, все верно и stage здесь и не нужен. При таком раскладе все работает без проблем? Я проверить не могу, ибо IDE заболела и из вредности отказывается вкомпиливать классы и трейсить. Бегло просмотрел код, ошибок не заметил, но у вас на ball нет фокуса, оттого он и не получает событие.
И да, у вас все в классах, что не может не радовать глаз после вопросов о кадрах. Но используйте типизацию переменных. Нормальный компилятор такое даже не скомпилит. Затем конструкторы пишутся с Большой Буквы, а в конце вызова конструктора принято писать круглые скобки, все же это вызов метода. И еще одно - как добавляете что-то на сцену, лучше в конструкторе (объекта gg в данном случае) прописать слушателя Event.ADDED_TO_STAGE, тогда и стейдж будет у него определен.

Triton36 28.06.2010 16:05

Вот основная поблема в том, что реакция на событие

keys.as
Код AS3:

 
movieclip.addEventListener(KeyboardEvent.KEY_DOWN, key_down); //изначально было movieclip.stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);

не наступает.

КорДум 28.06.2010 16:08

Я же сказал, что у вас нет фокуса на объекте, прочитайте про фокус.

Triton36 28.06.2010 17:24

Наверно я скажу глупость, но лучше всё же уточнить.
Программно фокус ставится
Код AS3:

var что-то:как-то = new нечто;
addChild(что-то);
stage.focus = что-то;

Т.е. на экземпляр класса. ball у меня главный класс, собственных экземпляров не имеет, значит появляется дополнительная проблема. Или можно ещё как-то присвоить к фокусу? Или имелось ввиду иное?

КорДум 28.06.2010 17:40

Самое простое - подписаться в классе gg на ADDED_TO_STAGE, затем приписать в том же классе
Код AS3:

stage.focus = this;

Добавлено через 2 минуты
Код AS3:

var ball:gg = new gg();
addChild(ball);
stage.focus = ball;

А вообще так в главном классе нужно.

Triton36 28.06.2010 17:55

Заветная жёлтая рамка появилась вокруг шарика(gg который). Однако на команды с клавиатуры всё также не отвечает.

КорДум 28.06.2010 21:10

Где вы такие уроки нашли, что вся логика нелогично и нерационально разнесена в классах? Я переделал для FD, закомментил ненужности и выяснил, что слушатели клавиатуры не вешаются на нужный объект, хотя по коду, вроде бы, на него вешается (я еле-еле разобрался в разноименных переменных, являющимися ссылками на одни и те же объекты, когда можно использовать одну статическую ссылку (синглтон так синглтон)). Парадокс. Необходимо срочно рационально структурировать весь код, поубирать дубликаты ссылок и вместо флешного твина обратить внимание на Tween Max/Lite.


Часовой пояс GMT +4, время: 23:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.