Могу ли я отслеживать нажатые клавиши, используя ActionScript?

#flash #actionscript #keylistener

#flash #actionscript #keylistener

Вопрос:

Могу ли я отслеживать нажатые клавиши, используя ActionScript?

Ответ №1:

Я использую этот класс, который я создал некоторое время назад:

РЕДАКТИРОВАТЬ: теперь немного чище.

     package
    {
        import flash.display.Stage;
        import flash.events.KeyboardEvent;

        public class Keys extends Object
        {
            // vars
            private var _keys:Array = [];

            /**
             * Constrcutor
             * @param stg The stage to apply listeners to
             */
            public function Keys(stg:Stage)
            {
                stg.addEventListener(KeyboardEvent.KEY_DOWN, _keydown);
                stg.addEventListener(KeyboardEvent.KEY_UP, _keyup);
            }

            /**
             * Called on dispatch of KeyboardEvent.KEY_DOWN
             */
            private function _keydown(e:KeyboardEvent):void
            {
                //trace(e.keyCode);
                _keys[e.keyCode] = true;
            }

            /**
             * Called on dispatch of KeyboardEvent.KEY_UP
             */
            private function _keyup(e:KeyboardEvent):void
            {
                delete _keys[e.keyCode];
            }

            /**
             * Returns a boolean value that represents a given key being held down or not
             * @param ascii The ASCII value of the key to check for
             */
            public function isDown(...ascii):Boolean
            {
                var i:uint;
                for each(i in ascii)
                {
                    if(_keys[i]) return true;
                }

                return false;
            }
        }
    }
  

Отсюда все просто: создайте экземпляр keys и используйте метод isDown().

     var keys:Keys = new Keys(stage);

    addEventListener(Event.ENTER_FRAME, _handle);
    function _handle(e:Event):void
    {
         if(keys.isDown(65)) trace('key A is held down');
    }
  

Он может даже проверять наличие нескольких клавиш одновременно:

 if(keys.isDown(65, 66)) // true if 'a' or 'b' are held down.
  

Редактировать:

Это также очень помогает при тестировании с использованием компиляции (ctrl enter) для отключения сочетаний клавиш (control -> отключить сочетания клавиш).

Комментарии:

1. Почему Keys расширяет Sprite?

2. Поскольку Object не имеет свойства stage, поскольку это не DisplayObject.

3. @miguelSantirso Как тебе это подходит?

4. Но в опубликованном вами коде свойство stage передается в качестве параметра конструктору класса, поэтому я не понимаю, зачем вам расширять Sprite…

5. Этап не был передан конструктору, когда Keys расширял Sprite — это была всего лишь одна поправка — см. правки.