Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3397 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 7:

Интерфейсы AсtionScript

Поддержка событий клавиатуры

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

Приемники событий

До сих пор мы работали с фильмами, активностью кадров и мышью. Все, что мы делали, это создавали функцию и присваивали ее управляющим элементам фильмов для событий, которые нужно было обрабатывать. Все становится немного сложнее, когда начинают использоваться события клавиатуры. Существуют два события для поддержки клавиш:

  • onKeyDown - происходит при нажатии клавиши.
  • onKeyUp - происходит, когда клавиша отпускается.

Вероятно, вы уже об этом знаете, и даже наполовину написали вашу функцию. Продолжим работу и посмотрим, что произойдет.

mc1_mc.onKeyDown = function() {
    this._xscale = 200;
    this._yscale = 200;
  };
  mc1_mc.onKeyUp = function() {
    this._xscale = 100;
    this._yscale = 100;
  };

Этот код идентичен тому коду, который вы писали для onMouseDown и onMouseUp. Так почему же ничего не происходит при его выполнении и нажатии клавиши? Потому, что mc1_mc не является приемником для событий клавиш.

Ранее мы приводили определение приемника. Теперь нам нужно узнать о нем немного больше. Как мы говорили ранее, приемник - это просто любой объект, который может принимать уведомление об определенных типах событий и выполнять какие-либо действия. Наши фильмы уже могут обрабатывать такие события, как движение мыши, нажатие и отпускание кнопки мыши, потому что фильм, по умолчанию, является приемником для событий мыши. Когда происходит событие мыши (движение или нажатие кнопки), все фильмы уведомляются об этом и реагируют соответствующим образом, если у них есть функция поддержки событий для этого события. Они не обязаны обрабатывать события, однако они могут это делать.

Но фильмы не являются приемниками событий клавиш. Независимо от того, нажмете ли вы клавиши слегка или с силой ударите кулаком по клавиатуре, mc1_mc никак не отреагирует на эти события. Даже если вы присвоили ему функцию поддержки обработки событий onKeyDown или onKeyUp, он никогда не получит уведомление, и функция никогда не будет выполнена.

Нужно сделать наш фильм приемником для событий клавиш. Это делается с помощью команды Key.addListener (object). Каждый фильм Flash имеет специальный объект с именем Key. У этого объекта есть параметры и методы (функции), которые протоколируют нажатия клавиш, какие именно клавиши были нажаты последними, какие клавиши нажаты в данный момент, какие специальные клавиши применены и т.д. Выражение Key.addListener (mc1_mc) сообщает объекту Key, что mc1_mc будет приемником для событий клавиш. Теперь каждый раз при нажатии или отпускании клавиши mc1 будет уведомляться. Это похоже на присутствие в списке рассылки: mc1 получает сообщение и узнает, когда нужно выполнять функции.

mc1_mc.onKeyDown = function() {
    this._xscale = 200;
    this._yscale = 200;
  };
  mc1_mc.onKeyUp = function() {
    this._xscaie = 100;
    this._yscaie = 100;
  };
  Key.addListener(mc1_mc);

Теперь все должно работать так, как и предполагалось.

Важно знать, что addListener применим не только к фильмам. Любой объект может быть приемником практически для любого типа события. Это означает, что вы можете создать свой собственный объект, который сможет принимать и обрабатывать события мыши, клавиш, а также другие события. Например, рассмотрим этот код.

myObj = new Object();
  myObj.onMouseMove = function() {
    mc1_mc._x = _root._xmouse;
    mc1_mc._y = _root._ymouse;
  };
  Mouse.addListener(myObj);

Видно, что mc1_mc здесь довольно пассивен. Он просто уведомляется о том, что нужно делать, посредством myObj, который обрабатывает события мыши move. myObj может принимать и поддерживать эти события, так как мы сделали его приемником для всех событий мыши с помощью команды Mouse.addListener ().

Создание простой игры

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

Эта игра не станет бестселлером. Мы не будем терять время на создание графики или специальных эффектов. Вместо этого мы изучим основные принципы использования управляющих элементов поддержки событий для управления, анимации и взаимодействия с графикой.

  1. В нашей игре будет немного стрельбы, поэтому, прежде всего, нужно создать прицел. Мы используем для этого вертикальную и горизонтальную линии. Вы в качестве прицела можете нарисовать то, что вам больше нравится. Создайте прицел в фильме с именем cursor и назовите инстанс именем cursor_mc.

    Всегда полезно держать код на отдельном слое, поэтому создайте еще один слой и назовите его, например, actions. Щелкните на кадре 1 слоя actions и откройте панель Aсtions. Теперь вы увидите то, что сэкономит вам многие часы. В правом верхнем углу панели Aсtions есть небольшой значок, похожий на кнопку. Щелкните на нем. Это кнопка Pin Current Script. После ее нажатия панель Aсtions будет прикреплена к сценарию, над которым вы работаете в данный момент. Вы можете выбрать другие кадры, объекты, кнопки, перейти в фильме на много уровней глубже, но сценарий, с которым вы работаете, останется в вашем окне в любом случае.


    Ключевым элементом в успешном программировании является централизация кода. Это означает, что нужно располагать код в одном месте, вместо того, чтобы вводить его в разных частях фильма. Весь наш код будет находиться в кадре 1 слоя Aсtions, который будет прикреплен к панели Aсtions, что позволит нам работать со всеми графическими элементами фильма без потери привязки к коду.

  2. Теперь введите следующий код.
    Mouse.hide();
      cursor_mc.onEnterFrame = function() {
        this._x += (_root._xmouse-this._x)/5;
        this._y += (_root._ymouse-this._y)/5;
      };

    Сначала мы скрываем указатель мыши, поэтому все, что мы теперь увидим - это cursor_mc. Далее мы присваиваем курсору функцию onEnterFrame для выполнения. Эта функция является простым уравнением сокращения. В нем вычисляется разница между указателем мыши (т.е. его позиция, несмотря на то, что в данный момент он невидим) и текущим положением cursor_mc, после чего результат делится на пять, и полученное значение прибавляется к позиции курсора. Это обеспечивает плавное движение курсора. (Это также несколько осложнит прицеливание и, следовательно, сделает игру интереснее!)

  3. Теперь, безусловно, нам нужны боеприпасы. Я просто нарисовал квадратик размером 4х4 пикселя и поместил его в фильм с именем bullet. Убедитесь, что отмечена опция Export for AсtionScript, и оставьте такое же имя bullet для идентификатора экспорта. Если после этого пуля все еще будет отображаться на экране, удалите ее. Мы будем добавлять пули из Library по мере необходимости.
  4. Мы будем использовать клавиатуру для инициализации, поэтому нам потребуется обработка событий клавиатуры. Создадим триггер для фиксирования этих событий. Затем мы превратим этот объект в приемник для событий клавиатуры. Вот соответствующий код.
    trigger = new Object ();
      Key.addListener (trigger);

    Здесь мы наблюдаем еще одно преимущество новой модели событий. Во Flash 5 для обработки событий клавиатуры нужно было использовать фильм или кнопку. Распространенным решением в данном случае было добавление пустого фильма на рабочее место и ввод в него некоторого кода onClipEvent (keyDown). Это нарушает принцип централизации кода, и, что еще хуже, пустой фильм отображается в виде маленькой белой точки на рабочем месте. Если поместить еще несколько таких объектов с графикой на рабочее место, станет очень трудно искать нужные части кода.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip?