Форум 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 (то есть таймер выполняется бесконечно).
Из официальной справки.
А вообще, это
Цитата:

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


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

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