воскресенье, 26 августа 2012 г.

KeyboardEvent

Привет.

Клавиатура - это хорошо, а две клавиатуры - лучше так что давайте посмотрим, как можно обработать события клавиатуры в ActionScript 3.0. Хотя бы на этом примере:
( Кликните на флеш-файл для получения фокуса )




Эй! Тут не написано какая клавиша нажата!
Как это не написано? Тут же есть поле Key code.

Там какие-то циферки. Как я по ним узнаю, что это за клавиша?
Выучи ASCII таблицу. Каждой клавише соответствует код. Эти коды в качестве констант есть у класса Keyboard, который находится в пакете flash.ui.
То есть можно написать:
switch ( e.keyCode )
{
    case Keyboard.SPACE :
        // Do something
    break;
}

В константе SPACE хранится число 32, но знать это необязательно.

В примере показано, нажата ли клавиша Ctrl или Shift. Как это узнать?
У KeyboardEvent, кроме keyCode, есть логические свойства: shiftKey и ctrlKey.

Также есть свойство - commandKey. Оно поддерживается только в Mac OS, и имеет то же значение, что и ctrlKey в Windows. В примере я его не использовал из-за расовой ненависти к Mac отсутствия Макинтоша для тестирования.

Как узнать нажата клавиша или отпущена?
Для этого существуют два разных слушателя: KeyboardEvent.KEY_DOWN и KeyboardEvent.KEY_UP.

Внимание! Attention! Ахтунг!
Добавить обработчик можно только на stage.
Вру. Кончено же, не только на stage. Еще на Input Text Field, чтобы контролировать что вводит пользователь.

Ага, учту. Давай что ли примерчик сделаем?
Окей.

Добавим 4 Dynamic Text текстовых поля с именами: eventTextshiftPressedTextkeyCodeTextctrlPressedText.

Main.as:
package
{
    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    
    public class Main extends MovieClip
    {
        
        public function Main () : void
        {
            this.init();
        }
        
        private function init () : void
        {
            this.stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
            this.stage.addEventListener( KeyboardEvent.KEY_UP, keyUpHandler );
        }
        
        private function keyDownHandler ( e : KeyboardEvent ) : void
        {
            this.eventText.text = "Key Down";
            this.shiftPressedText.text = String( e.shiftKey );
            this.keyCodeText.text = String( e.keyCode);
            this.ctrlPressedText.text = String( e.ctrlKey );
        }
        
        private function keyUpHandler ( e : KeyboardEvent ) : void
        {
            this.eventText.text = "Key Up";
            this.shiftPressedText.text = String( e.shiftKey );
            this.keyCodeText.text = String( e.keyCode);
            this.ctrlPressedText.text = String( e.ctrlKey );
        }
    }
}


Исходник.

Удачи!

5 комментариев:

  1. Здравствуйте!
    С чего лучше начать изучение flash, и в частности as3.0? Пытался изучать курс "AS 3.0 и основы объектно-ориентировочного программирования" с сайта easyflash.org, и из двух первых уроков ничего не получилось, делаю всё как показывают - вылазят ошибки. На сайте их мёртвом толком ничего объяснить не могут, говорят что код правильно написал.
    Сейчас скачал книгу Мука, буду читать.
    Я собираюсь в будущем попробовать зарабатывать фрилансом, может быть есть какие-то отдельные курсы по созданию баннеров, флеш-открыток, логотипов и т.д.?

    ОтветитьУдалить
  2. Привет!
    На счет баннеров, флеш-открыток и логотипов подсказать не смогу, так как я этим не занимался ( фантазия не та, да и рисовать не особо умею ).

    Я изучал ActionScript программируя какие-то проекты ( в основном небольшие игры ).
    Тут все зависит от цели.
    Если цель - создавать баннеры и т.д., то обширных знаний языка не нужно.
    Если цель - писать игры, то, естественно, придется знать на порядок больше.
    На мой взгляд, в обоих вариантах лучшее обучение - это практика. Книги нужны лишь для того, чтобы найти в них решение какой-нибудь задачи ( однако, поиск в интернете, вероятно, даст больше результатов ). Я к тому, что просто прочитать книгу от начала до конца мало что даст. В общем, «Проблемы нужно решать по мере их поступления». :)
    Так что нужно начать что-то делать и искать решения/задавать вопросы, если что-то не получается.

    ОтветитьУдалить
  3. Может быть вы можете мне помочь с одной проблемой? Ситуация простая, рожица(смайлик) кривляется, по нажатию кнопки она должна замирать. При запуске вылетает такая ошибка: "строка 19 1083: Синтаксическая ошибка: else не ожидается". С другими 4 помарками я сам справился, а тут - не понимаю что такое(
    Смайлик - символ, внутри него анимация движения рта.
    Попробую вставить код этот.

    smyle_mc.x = stage.stageWidth/2 - smyle_mc.width/2;
    smyle_mc.y = stage.stageHeight/2 - smyle.mc.height/2;


    var isPlayng:Boolean = false;

    btn.addEventListener(MouseEvent.CLICK, oMClick);


    function oMClick (e:MouseEvent):void
    {

    if (isPlaying)
    {
    trace("Болтай!");
    smyle_mc.mouth_mc.play();
    isPlaying = false;
    }
    else
    {
    trace("Не болтай!");
    smyle_mc.mouth_mc.gotoAndStop(5);
    isPlaying = true;
    }
    }

    Я рисую во флеше недели 3 с перерывами, а с AS3.0 познакомился только вчера, так что вполне адекватно объяснить, наверное не получилось.
    P.S. Если в поисковике ввести "новогодняя флеш открытка с оленями", вылетит открытка синего цвета с оленями и Сантой, которые при нажатии на них начинают танцевать. Вот что-то примерно такое.

    ОтветитьУдалить
    Ответы
    1. Ваш код рабочий. Я нашел только две помарки:
      В строке 2:
      smyle_mc.y = stage.stageHeight/2 - smyle.mc.height/2;
      smyle.mc, а не smyle_mc.
      И при объявлении переменной:
      var isPlayng:Boolean = false;
      isPlayng, а не isPlaying.
      Остальное все работает. Могу выслать Вам .fla файл с рабочим кодом. Или можете выслать мне свой .fla файл ( на почту konanmentor[dog]gmail.com ), и я посмотрю что там не так.

      Удалить
  4. День добрый!
    Я по ошибке выложил старую версию кода, с ошибками. Вернее, я с досады удалил файл, а новый код в блокнот забыл скопировать. Я заново его сделаю и вышлю Вам.

    ОтветитьУдалить