PDA

Просмотр полной версии : KeyboardEvent


BlooDHounD
28.12.2005, 03:01
Как его обработать нормально?


пока объект лежал на руте, вроде бы как работало. как только закопал его поглубже - всё сломалось и чиниться не хочет.

В общем помогайте :)

Описываю как сейчас:

Есть класс. В нём в конструкторе написано: public function Example()
{
...
this.addEventListener(KeyboardEventType.KEY_DOWN, this.onKeyDown);
}
private function onKeyDown(event:KeyboardEvent):Void
{
trace(event.keyCode);
event.updateAfterEvent();
}Не работает %)
Все события локальные, как сделать его глобальным? Выносить за пределы класса совсем не хочется. Давайте подумаем.

john
28.12.2005, 15:58
все задают похожие вопросы, и я тоже задаю,
пока не нашел,
единственное пока знаю,
чтобы перехватывать события клавиатуры, спрайт который перехватывает должен быть в фокусе ввода -

staget.focus = this;

а вот как глобально - самому интересно;

john
28.12.2005, 16:27
помоему решение таится в методе setCapture();
во всяком случае данный метод используется в drag&drop решениях для того чтобы слушать глобальные события мыши, но как импользоваться я пока не понял - дает исключение.

john
28.12.2005, 16:35
а ларчик просто открывался....
stage.addEventListener(KeyboardEventType.KEY_DOWN, onKeyDown);

BlooDHounD
28.12.2005, 16:46
как им пользоваться я понял с большей части. но вот только этот метод относиться к событиям мыши больше. когда создаёшь листенер там есть параметр useCapture. Так вот можно создать 2 разных события и обрабатываться они будут в разное время.

Посмотри мой тутор у майка в блоге про палитру. я там на курсорах юзал этот самый каптуре.
попробуй сделать без них, и вытащи мышку за границы селектора. событие вызовится. но если стаит каптуре, то событие вызывается только поотпусканию мыши.

john
28.12.2005, 16:53
Параметр useCapture ведь это лишь слушать capture-фазу... а setCaputure - это слушать все события мыши (и клавиатуры судя по хелпу) независимо от того в какой точки иерарихи спрайтов находимся. Что я не улавливаю связи. Приведи пример. Интересно.

BlooDHounD
28.12.2005, 17:08
ну блин. я же написал где пример смотреть. :)
"лень - двигатель прогресса" - это я понимаю, но затратить 2 минуты чтобы в блог самому зайти ... рррррррррр, а ещё новичков гоняете за лень.

по существу.

возвращаюсь к воспросу. весь прикол в том что stage почему-то доступен только из рута. Если я пытаюсь написать строчку глубже он пишет:

TypeError: Error #1009: null has no properties.

Я конечно всё понимаю .... но так во всех классах у меня. Я сперва писал в контрукторе и понял типа что возможно не видит из-за того что объект не добавлен на сцену. Вынес из конструктора, а фиг. всёравно одно и тоже.

john
28.12.2005, 18:03
ну блин. я же написал где пример смотреть. :)
"лень - двигатель прогресса" - это я понимаю, но затратить 2 минуты чтобы в блог самому зайти ... рррррррррр, а ещё новичков гоняете за лень.


а вот не правда ваша... я читал пост без указания на пример, вы ее (указание) потом прилепили :D

пример посмотрел,

но.... ничего мне это не дало, видел до этого использование setCaputure() как я понял setCapture() можно вызывать между событиями MOUSE_DOWN и MOUSE_UP, в других случаях дает исключение. Чтото вроде - "у меня уже есть кепчур".

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

BlooDHounD
28.12.2005, 18:33
да не в гетере дело ... тут иногда доступен а иногда нет. и как определить это самое иногда я не представляю :(

после сеткаптуре, события овер и оут перестают улавливаться ....

john
28.12.2005, 19:00
думаю тут проблема в инициализации, в конструкторе может быть что нет еще stage, а вот в каком нибудь INIT или ADDED есть,
кстати верно, нужно проверить.

BlooDHounD
28.12.2005, 22:09
да я уже проверил. ADDED срабатывает иногда несколько раз. почему я так и не понял. я думал он сработает на addChild, а REMOVED на removeChild. однако я ошібался.
Проблему решил :) именно тем что докопал. в общем вся цепочка уже должна лежать на стэйдже. до этого он не виден. соответсвенно в контрукоторе это писать бессмысленно, так как в цепочке его явно нету.