Форум Flasher.ru

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

rootForMe 07.05.2012 17:12

Прерывание события клавиатуры в AS3
 
Доброго времени суток .

Приступим сразу к делу, а дело в том, что имеются два объекта подписанные на событие KeyDown следующим кодом :

Код AS3:

private function keyDowned(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.RIGHT)
                        {
                                object1.move();
                        }
                        if (e.keyCode == Keyboard.D)
                        {   
                              object2.move();
                        }
}

И к примеру я держу кнопку "влево" и объект1 двигается , но когда нажимаю кнопку "D" начинает двигаться объект2, но перестает обьект1 хотя кнопку "влево" я до сих пор держу . И сам вопрос : Почему происходит такое прерывание ? И как его избежать ! .

Wolsh 07.05.2012 17:27

Никак, так работает клавиатура. Например, когда нажаты некоторые пары клавиш, нажатие третьей вообще не диспатчится. Это особенности контроллера клавиатуры и распайки клавиш.
Стройте функции так, чтобы при нажатии объект начинал и продолжал(!) двигаться, пока клавиша не будет отжата.

rootForMe 07.05.2012 17:52

можете привести какой нибудь простенький пример?

Yahen 07.05.2012 19:00

Я еще добавлю свои пять копеек. Количество и качество отслеживаемых клавиш зависит не только от того какие и в какой комбинации были нажаты, но и от модели клавиатуры.
Обработка клавиш дело тонкое. И не всегда логичное.

Wolsh 07.05.2012 20:16

Цитата:

можете привести какой нибудь простенький пример?
Ну примитивно как-то так (только в методе move() надо сделать прием события класса Event). Это только намек(!)
Код AS3:

private function handlerKeyDown(e:KeyboardEvent):void 
{
        if (e.keyCode == Keyboard.RIGHT)
        {
                addEventListener(Event.ENTER_FRAME, object1.move);
        }
        if (e.keyCode == Keyboard.D)
        {   
                addEventListener(Event.ENTER_FRAME, object2.move);
        }
}
 
private function handlerKeyUp(e:KeyboardEvent):void
{
        if (e.keyCode == Keyboard.RIGHT)
        {
                removeEventListener(Event.ENTER_FRAME, object1.move);
        }
        if (e.keyCode == Keyboard.D)
        {   
                removeEventListener(Event.ENTER_FRAME, object2.move);
        }
}


rootForMe 08.05.2012 10:02

Недождавшись вначале ответа сделал сам, но через булевские переменные . Но у вас способ по изящней , спасибо.

sanchoys14 16.05.2012 14:35

Раз уж тему ещё не закрыли, тогда может мне кто-то подскажет, почему у мкня не работает данный код:
Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKD);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKU);
 
 
 
function onFrR(e:Event):void{no1.x +=5;};
function onFrL(e:Event):void{no1.x -=5;};
function onFrU(e:Event):void{no1.y -=5;};
function onFrD(e:Event):void{no1.y +=5;};
 
function onKD(e:KeyboardEvent):void{
        if(e.keyCode == Keyboard.RIGHT){
        stage.addEventListener(Event.ENTER_FRAME, onFrR);
        } else if(e.keyCode == Keyboard.LEFT){
                stage.addEventListener(Event.ENTER_FRAME, onFrL);
        } else if(e.keyCode == Keyboard.UP){
                stage.addEventListener(Event.ENTER_FRAME, onFrU);
        } else if(e.keyCode == Keyboard.DOWN){
                stage.addEventListener(Event.ENTER_FRAME, onFrD);
        }
}
 
function onKU(e:KeyboardEvent):void{
        if(e.keyCode == Keyboard.RIGHT){
        stage.removeEventListener(Event.ENTER_FRAME, onFrR);
        } else if(e.keyCode == Keyboard.LEFT){
                stage.removeEventListener(Event.ENTER_FRAME, onFrL);
        } else if(e.keyCode == Keyboard.UP){
                stage.removeEventListener(Event.ENTER_FRAME, onFrU);
        } else if(e.keyCode == Keyboard.DOWN){
                stage.removeEventListener(Event.ENTER_FRAME, onFrD);
        }
}


Партизан 16.05.2012 14:42

Держите http://www.flasher.ru/forum/blog.php?b=267

sanchoys14 16.05.2012 14:55

Спасибо, но было бы лучше если бы вы обьяснили почуму не работает мой код. Сразу он работал нормально, а потом перестал совсем. В чём проблема?

Партизан 16.05.2012 15:14

Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKD);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKU);

Может не отслеживаете KEY_UP?


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

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