Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как использовать KeyboardEvent в классах? (http://www.flasher.ru/forum/showthread.php?t=199511)

zCHESNOKz 19.05.2013 17:38

Как использовать KeyboardEvent в классах?
 
Не могу понять структуру кода. Как использовать наследование к KeyboardEvent ?
у меня есть основной класс Engine - вход в игру.
Далее имеется класс Ship - он размещается, я так понимаю на stage ( сцене ) класса Engine, так как он главный класс.
Я прописал события клавиатуры в классе Ship, только ничего не работает. Как правильно расположить KeyboardEvent в классе Ship ?
Код AS3:

addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
 
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);
 
this.addEventListener(KeyboardEvent.KEY_DOWN,keyDownF);

не понимаю.. По идее сцена stage - одна. и Слушателе должны размещаться на ней а не на мувике Ship. В чем проблема?
За ранее спасибо.

TWETTI 19.05.2013 18:23

Как только будет создан экземпляр класса Ship, доступа к stage не будет и подписаться на событие KeyboardEvent.KEY_DOWN в конструкторе не получится. Нужно дождаться, пока Ship не будет добавлен на stage. В конструкторе класса Ship напишите:
Код AS3:

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

И далее напишите:
Код AS3:

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 минуту


а нужно ли после писать ?
Код AS3:

removeEventListener(Event.ADDED_TO_STAGE, init);


caseyryan 19.05.2013 20:57

Цитата:

а нужно ли после писать ?
Если не предполагается, что экземпляр будет повторно добавляться, и не нужно чтобы вызывался какой-то код при добавлении на сцену, то да, желательно.

КорДум 19.05.2013 22:11

Цитата:

то да, желательно
Обязательно. Иначе хендлер сработает два раза.

caseyryan 20.05.2013 08:05

Цитата:

Иначе хендлер сработает два раза.
Сань, с чего ты это взял?
Один раз он сработает.
Код AS3:

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("Добавлено"); // выводится только один раз
 
        }
}

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

Babylon 20.05.2013 08:55

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

caseyryan 20.05.2013 09:23

чем лучше?
Цитата:

Вместо использования метода setInterval() рекомендуется создавать объект Timer с заданным интервалом, в котором в качестве параметра repeatCount используется значение 0 (то есть таймер выполняется бесконечно).
Из официальной справки.
А вообще, это
Цитата:

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

Babylon 20.05.2013 10:10

Я нигде не написал, что нельзя. Я написал лучше.

caseyryan 20.05.2013 10:14

Ну вот отсюда и был вопрос, чем лучше?

Babylon 20.05.2013 10:24

Лучше тем что вы управляете частотой интервала.

КорДум 20.05.2013 11:29

Цитата:

Сообщение от caseyryan (Сообщение 1133962)
Сань, с чего ты это взял?
Один раз он сработает.

http://www.flasher.ru/forum/blog.php?bt=8702
Где-то полгода назад споткнулся сам на этой "фиче". Неужто поправили?

Добавлено через 5 минут
Цитата:

Сообщение от Babylon (Сообщение 1133972)
Лучше тем что вы управляете частотой интервала.

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

Babylon 20.05.2013 11:54

То что любой таймер "завязан на энтерфрейме" я не знал. То есть вы предлагаете манипулировать фреймрейтом?

КорДум 20.05.2013 11:57

В данном случае да, его (энтерфрейм) использование здесь оправдано. Таймер на мой взгляд нужен для выполнения "отложенных" операций типа проверки на таймаут коннекта или там еще что. Даже твины все, сделанные по времени, опираются на кадры, хотя и используют getTimer() для определения разницы во времени между кадрами, чтобы успеть отобразить объект в конечной точке в заданное время.

caseyryan 20.05.2013 14:15

Цитата:

Где-то полгода назад споткнулся сам на этой "фиче". Неужто поправили?
Нет, не поправили. Но в этом контексте сработает только 1 раз.


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

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