Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   менеджер кейкодов клавиатуры (http://www.flasher.ru/forum/showthread.php?t=177126)

anmelegov 25.03.2012 02:33

менеджер кейкодов клавиатуры
 
Как лучше? вот так:
Код AS3:

private var keypressed:Vector.<uint> = new Vector.<uint>;
private function keyPressed(e:KeyboardEvent):void {
        var bool:Boolean = false;
        for (var i:uint = 0; i < keypressed.length; i++) {
                if (keypressed[i]==e.keyCode) {
                        bool=true;
                }
        }
        if (!bool) {
                keypressed.push(e.keyCode);
        }
}
 
private function keyUnpressed(e:KeyboardEvent):void {
        for (var i:uint = 0; i < keypressed.length; i++) {
                if (keypressed[i]==e.keyCode) {
                        keypressed.splice(i,1);
                        i--;
                }
        }
}

или вот так:
Код AS3:

private var keyPressed:uint = 0;
private function keyDownHandler(e:KeyboardEvent):void {
        switch(e.keyCode) {
                case 87: // w
                        keyPressed |= 1;
                        break;
                case 65: // a
                        keyPressed |= 2;
                        break;
                case 83: // s
                        keyPressed |= 4;
                        break;
                case 68: // d
                        keyPressed |= 8;
                        break;
        }
}
private function keyUpHandler(e:KeyboardEvent):void {
        switch(e.keyCode) {
                case 87: // w
                        keyPressed -= 1;
                        break;
                case 65: // a
                        keyPressed -= 2;
                        break;
                case 83: // s
                        keyPressed -= 4;
                        break;
                case 68: // d
                        keyPressed -= 8;
                        break;
        }
}


Wolsh 25.03.2012 04:36

Создаете new Vector.<Boolean>(0xFF, true)
Адрес каждой ячейки (число) – это код клавиши, а в ячейке соответственно хранится true или false, нажата или нет.

Добавлено через 6 минут
Код AS3:

private var keypressed:Vector.<Boolean> = new Vector.<Boolean>(0xFF, true);
private function keyDownHandler(e:KeyboardEvent):void {
        keypressed[e.keyCode] = true;
}
private function keyUpHandler(e:KeyboardEvent):void {
        keypressed[e.keyCode] = false;
}


anmelegov 25.03.2012 11:25

я вынес в отдельный класс вообще и сделал со словарем
Код AS3:

package {
        import flash.display.Stage;
        import flash.events.KeyboardEvent;
        import flash.utils.Dictionary;
 
        public class KeyboardManager {
                private var m_pressedKeys:uint = 0;
                private var keyDictionary:Dictionary;
                public function KeyboardManager(stage:Stage):void {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
                        keyDictionary = new Dictionary();
                        keyDictionary[87] = 1; // w
                        keyDictionary[65] = 2; // a
                        keyDictionary[83] = 4; // s
                        keyDictionary[68] = 8; // d
                }
                private function keyDownHandler(e:KeyboardEvent):void {
                        m_pressedKeys |= keyDictionary[e.keyCode];
                }
                private function keyUpHandler(e:KeyboardEvent):void {
                        m_pressedKeys -= keyDictionary[e.keyCode];
                }
                public function get pressedKeys():uint { return m_pressedKeys };
        }
}

Добавлено через 1 минуту
можно как-то слушать изменение переменной m_pressedKeys? или надо в оба хендлера проверки добавлять?

carrotoff 25.03.2012 11:36

Словарь здесь не нужен. Посмотрите еще раз внимательно на пример Wolsh'a

anmelegov 25.03.2012 11:42

Цитата:

Сообщение от carrotoff (Сообщение 1070997)
Словарь здесь не нужен. Посмотрите еще раз внимательно на пример Wolsh'a

решение классное но меня смущает то что длина массива 255 бит, а в моей реализации 4 бита... или норм?

Добавлено через 5 минут
как потом этот массив обрабатывать? если for each сделать то будет 255 итераций?

Добавлено через 24 минуты
в моем способе тоже обработка не очень:
Код AS3:

for (var key:uint = 1; key <= keyboardManager.pressedKeys; key *= 2) {
        switch (keyboardManager.pressedKeys & key) {

получается если нажата только "последняя кнопка" то приходится делать 4 итерации, наверно самый правильный способ это самый первый =)

Wolsh 25.03.2012 12:09

Не, если Вас только 4 постоянные клавиши "в сад" интересуют, то фиг бы с ним. Полный слепок клавиатуры полезен когда предполагается ее почти всю задействовать, да всякие фишки типа кеймаппинга при этом использовать (переназначения клавиш, как в "больших" играх, да с сохранением измененных настроек).

anmelegov 25.03.2012 12:18

Цитата:

Сообщение от Wolsh (Сообщение 1071003)
Не, если Вас только 4 постоянные клавиши "в сад" интересуют, то фиг бы с ним. Полный слепок клавиатуры полезен когда предполагается ее почти всю задействовать, да всякие фишки типа кеймаппинга при этом использовать (переназначения клавиш, как в "больших" играх, да с сохранением измененных настроек).

кнопок будет штук 10 задействовано

Добавлено через 1 минуту
ну у меня в свиче в первой строчке стоит
Код AS3:

case 0: break

чтобы если 0, то дальше не проверяло

Добавлено через 10 минут
че-то туплю... там 0 нужен =)

Добавлено через 12 минут
или нужен... фак.. запутался


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

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