Просмотр полной версии : Как использовать KeyboardEvent в классах?
zCHESNOKz
19.05.2013, 17:38
Не могу понять структуру кода. Как использовать наследование к KeyboardEvent ?
у меня есть основной класс Engine - вход в игру.
Далее имеется класс Ship - он размещается, я так понимаю на stage ( сцене ) класса Engine, так как он главный класс.
Я прописал события клавиатуры в классе Ship, только ничего не работает. Как правильно расположить KeyboardEvent в классе Ship ?
addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
this.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
не понимаю.. По идее сцена stage - одна. и Слушателе должны размещаться на ней а не на мувике Ship. В чем проблема?
За ранее спасибо.
Как только будет создан экземпляр класса Ship, доступа к stage не будет и подписаться на событие KeyboardEvent.KEY_DOWN в конструкторе не получится. Нужно дождаться, пока Ship не будет добавлен на stage. В конструкторе класса Ship напишите:
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
И далее напишите:
private function init(event:Event = null):void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
}
zCHESNOKz
19.05.2013, 20:29
да, все работает, огромное спасибо. а можете конкретней объяснить, почему так происходит ?
Как только будет создан экземпляр класса Ship, доступа к stage не будет
caseyryan
19.05.2013, 20:33
Потому что он еще не добавлен в список отображения во время инициализации конструктора. Ссылка на стейдж появляется только после того, как объект добавили в дисплей лист через addChild.
zCHESNOKz
19.05.2013, 20:43
я думаю в последующем мне придется часто использовать данный код, так как я не смогу работать объектами, можно сказать, не оттянув время для его инициализации на сцене, верно?
Добавлено через 1 минуту
а нужно ли после писать ? removeEventListener(Event.ADDED_TO_STAGE, init);
caseyryan
19.05.2013, 20:57
а нужно ли после писать ?
Если не предполагается, что экземпляр будет повторно добавляться, и не нужно чтобы вызывался какой-то код при добавлении на сцену, то да, желательно.
то да, желательно
Обязательно. Иначе хендлер сработает два раза.
caseyryan
20.05.2013, 08:05
Иначе хендлер сработает два раза.
Сань, с чего ты это взял?
Один раз он сработает.
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite {
public function Main() {
var test:Test = new Test();
addChild(test);
}
}
}
import flash.display.Sprite;
import flash.events.Event;
internal class Test extends Sprite {
public function Test() {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
trace("Добавлено"); // выводится только один раз
}
}
Плюс, не обязательно же при добавлении будут какие-то инициализации. У меня часто бывает так, что при добавлении добавляется энтерфрейм слушатель, к примеру, а при удалении из дисплей листа и энтерфрейм слушатель удаляется.
энтерфрейм лучше использовать для мувиклипов, а для для однофреймовых спрайтов сетинтервал:)
caseyryan
20.05.2013, 09:23
чем лучше?
Вместо использования метода setInterval() рекомендуется создавать объект Timer с заданным интервалом, в котором в качестве параметра repeatCount используется значение 0 (то есть таймер выполняется бесконечно).
Из официальной справки (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/package.html#setInterval()).
А вообще, это
энтерфрейм лучше использовать для мувиклипов, а для для однофреймовых спрайтов сетинтервал
не правда. Энтерфрейм и количество (или вообще наличие кадров) у объекта, не имеют ничего общего.
Для спрайта так же можно использовать энтер фрейм, как и для мувиклипа и для других дисплей объектов
Я нигде не написал, что нельзя. Я написал лучше.
caseyryan
20.05.2013, 10:14
Ну вот отсюда и был вопрос, чем лучше?
Лучше тем что вы управляете частотой интервала.
Сань, с чего ты это взял?
Один раз он сработает.
http://www.flasher.ru/forum/blog.php?bt=8702
Где-то полгода назад споткнулся сам на этой "фиче". Неужто поправили?
Добавлено через 5 минут
Лучше тем что вы управляете частотой интервала.
Очень сомнительное высказывание в контексте обсуждения, учитывая, что любой таймер зависит от фреймрейта, то есть завязан на энтерфрейме.
То что любой таймер "завязан на энтерфрейме" я не знал. То есть вы предлагаете манипулировать фреймрейтом?
В данном случае да, его (энтерфрейм) использование здесь оправдано. Таймер на мой взгляд нужен для выполнения "отложенных" операций типа проверки на таймаут коннекта или там еще что. Даже твины все, сделанные по времени, опираются на кадры, хотя и используют getTimer() для определения разницы во времени между кадрами, чтобы успеть отобразить объект в конечной точке в заданное время.
caseyryan
20.05.2013, 14:15
Где-то полгода назад споткнулся сам на этой "фиче". Неужто поправили?
Нет, не поправили. Но в этом контексте сработает только 1 раз.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.