Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Чем заменить isKeyDown? (http://www.flasher.ru/forum/showthread.php?t=118446)

Smirnov48 24.11.2008 13:40

Чем заменить isKeyDown?
 
Нашел примерно следующее:
Код AS3:

                        var keyArray:Array = new Array();
                        var i:Number;
                        for (i=0; i<222; i++) {
                                keyArray.push([i,false]);
                        }
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
                        stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp);
                        function checkKeysDown(event:KeyboardEvent):void {
                                keyArray[event.keyCode][1]=true;
                        }
                        function checkKeysUp(event:KeyboardEvent):void {
                                keyArray[event.keyCode][1]=false;
                        }
                        function isKeyDown(X:Number) {
                                return keyArray[X][1];
                        }

но, почему-то, это решение меня смущает.. подскажите, пожалуйста, как более правильно заменить isKeyDown из AS2? И вообще не очень понятно, зачем разработчики убрали данную функцию? Хотя... раз они ее убрали, значит не хотели, чтоб ей пользовались, а значит писать надо как-то по другому... но как? :wacko:

CrazyFlasher 24.11.2008 13:53

Код:

package ee.cfco.darkness.model.userControls
{
       
        import com.adobe.utils.ArrayUtil;
       
        public class KeyHandler
        {
                public static var keysPressed:Array = new Array();
                public static var keyProcessed:Boolean;
               
                public static var movementEnabled:Boolean = true;
               
                public static function clear():void {
                        keysPressed = new Array();
                        keyProcessed = false;
                }
               
                public static function someKeyIsDown():Boolean {
                        return KeyHandler.keysPressed.length > 0;
                }
               
                public static function isDown(key:int):Boolean {
                        for each(var k:int in KeyHandler.keysPressed) {
                                if (k == key) return true;
                        }
                        return false;
                }
               
                public static function keyDown(key:int):void {
                        KeyHandler.keysPressed.push(key);
                        KeyHandler.keysPressed = ArrayUtil.createUniqueCopy(KeyHandler.keysPressed);
                }
               
                public static function keyUp(key:int):void {
                        ArrayUtil.removeValueFromArray(KeyHandler.keysPressed, key);
                }
               
        }
       
}

я на днях для игрушки сделал такой класс...может пригодится

AL.exe 24.11.2008 13:53

А зачем ее использовать? Вижу смысл только в том случае, если вы хотите какую-то клавишу использовать в качестве модификатора.

Smirnov48 26.11.2008 11:22

CrazyFlasher - спасибо :) я правда тут еще один вариант нашел:
Код AS3:

package{
        import flash.events.KeyboardEvent;
        import flash.display.Stage;
        import flash.utils.Dictionary;
        public class KeyController{
                private var _keys:Dictionary;
                public function KeyController(stage:Stage) {
                        _keys = new Dictionary();
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
                }
                public function isKeyDown(keyCode:uint):Boolean {
                        return _keys[keyCode];
                }
                private function keyDownHandler(event:KeyboardEvent):void {
                        _keys[event.keyCode] = true;
                }
                private function keyUpHandler(event:KeyboardEvent):void {
                        _keys[event.keyCode] = false;
                }
        }
}

AL.exe - согласен, для модификаторов наверное самое лучшее применение. Но лично я хотел организовать с помошью isKeyDown - примерно такой игровой цикл:
Код:

        Обрабатываем нажатые клавиши(if (isKeyDown(...) и реакции на них.
        Перемещаем обьект на сцене.
        Обрабатываем столкновения.

Я не прав? :o

mort 26.11.2008 16:56

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

MerlinTwi 27.11.2008 12:32

Если при нажатой клавише флешка потеряет фокус, то KEY_UP не сработает и клавиша "залипнет" в нажатом состоянии. Добавьте
Код:

stage.addEventListener(Event.DEACTIVATE, allKeyUpHandler);

private function allKeyUpHandler(event:Event):void {
        _keys = new Dictionary();
}


AL.exe 28.11.2008 00:48

MerlinTwi, а если флешка потеряет фокус, а клавиша отжата не будет, то при возвращении фокуса ивент KEY_DOWN снова выстрелит?

MerlinTwi 28.11.2008 17:31

Нет, не выстрелит. Нужно будет отпустить и нажать клавишу снова. Что гораздо меньшая "потеря" нежели "залипшие" клавиши.
Такое вообще может произойти реально очень редко, чтобы юзер вернул фокус на флешку не отпуская кнопку :)

sinya 03.12.2008 19:46

Привет. Сегодня впервые сел за АС3. Кое-что уже проясняется. Но вот не понял, как воспользоваться ф-цией isKeyDown() класса KeyController (описан выше) ? Я создаю отдельный класс KeyController.as, записываю его туда же, куда и основной класс. В основном классе пишу import KeyController; потом в одной из ф-ций основного класса пишу и так trace (isKeyDown(48)); и так trace (KeyController.isKeyDown(48)) - не работает. "Call to a possibly undefined method isKeyDown" . Да и на сам класс KeyController никакой реакции, пишу там что попало - ошибок не выдает. Как его подключить?

musat 03.12.2008 20:24

sinya
Надо создать экземпляр класса и передать ссылку на stage:
Код AS3:

var keyController:KeyController = new KeyController(stage);
trace(keyController.isKeyDown(48));



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

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