[3]: ENTER_FRAME

Приветствую вас, друзья, сегодня я расскажу вам про мегаважную шутку – обработчик событий – ENTER_FRAME, и  каким образом им пользоваться в ADOBE FLASH :)

Во флеше есть различные события, а для того чтобы вызвать какое-либо из них, нужно написать name.addEventListener(), где name – имя объекта, к которому применяется событие.
Допустим вариант stage.addEventListener() – будет применяться ко всей сцене,
а вариант car.addEventListener() будет применяться к клипу на сцене с именем car.

Давайте провернем такое дело. Создадим на сцене 2 объекта с именем krug и kvadrat.
Далее напишем функцию, в которой опишем как будут передвигаться наши объекты:

Полдела сделано :) Если не понимаете что в этой функции смотрите урок 2.
Теперь нам осталось вызвать обработчик события ENTER_FRAME, в котором мы будем вызывать нашу функцию apelsin () в каждом кадре. Для это напишем:

stage – применительно ко всей сцене
.addEventListener() – вызываем слушатель событий
Event – выбираем событие
.ENTER_FRAME – которое  в каждом кадре
apelsin – вызывает функцию “Апельсин”.

В общем, эта строка будет выполнять функцию “апельсин” в каждом кадре. :)

Вот собственно и всё :) Есть ещё более короткий способ вызова  функции, но он не столь удобный, и он разобран в видео.

Обо всём этом (и не только этом) смотрите в видеоуроке ниже:

Исходник: yadi.sk/d/uEAst6dTF46HQ
Код ActionScript 3.0 из урока:

Всё подробно рассказано в видео :) Если будут какие-либо вопросы, пишите в комментариях к видео. Надеюсь, данный урок по реализации обработчика события .ENTER_FRAME  в action script 3.0 в программе adobe flash, поможет вам в разработке игр и приложений. :)

Комментарии
  1. Дмитрий

    У меня просьба подскажите код с событием ENTER_FRAME.
    Щелкаем кнопкой мыши на сцене – шар начинает двигаться в указанную точку (stageX, stageY) с постоянной скоростью. Какой код, и можно ли код написать по разному.

    • admin

      import flash.events.MouseEvent;
      import flash.events.Event;

      var speed = 5; //скорость шара ball
      var mx, my ; // координаты мыши в момент клика
      var xmov = 0; // скорость шара по х
      var ymov = 0; // скорость шара по У

      stage.addEventListener(MouseEvent.CLICK, mc);
      stage.addEventListener(Event.ENTER_FRAME, ef);

      //клик мыши по сцене
      function mc (e:MouseEvent) {
      // сохраняем координаты курсора в переменные
      mx = mouseX;
      my = mouseY;
      trace (“mx = “, mx, “my = “, my);
      // функция поиска скоростей
      findSpeed ();
      }

      // функция поиска скоростей
      function findSpeed () {
      var xdiff = mx – ball.x ;
      var ydiff = my – ball.y ;
      // угол между результирующим вектором и осью оХ
      var alfa = Math.atan2(ydiff, xdiff);
      trace (“угол = “, alfa*180/Math.PI);
      // скорости по х и у
      xmov = speed * Math.cos(alfa);
      ymov = speed * Math.sin(alfa);
      trace (“xmov =”, xmov, “ymov = “, ymov);
      }

      function ef (e:Event) {
      // временное положение шара в кадре
      ball.tempx = ball.x + xmov;
      ball.tempy = ball.y + ymov;

      // r1 – расстояние от центра шара до точки назначения в прошлом кадре
      var r1 = Math.sqrt((mx – ball.x)*(mx – ball.x) +
      (my – ball.y)*(my – ball.y));
      // r2 – расстояние от центра шара до точки во временном положении шара
      var r2 = Math.sqrt((mx – ball.tempx)*(mx – ball.tempx) +
      (my – ball.tempy)*(my – ball.tempy));

      // если расстояние в следующем кадре дальше от точки, значит шар пролетит через точку дальше, поэтому…
      if (r2 > r1) {
      // ставим шар в эту точку
      ball.x = mx;
      ball.y = my;
      // обнуляем скорости
      xmov= 0;
      ymov= 0;
      }
      // передвигаем шар на величину скоростей
      ball.x += xmov;
      ball.y += ymov;
      }

      исходник: http://yadi.sk/d/ZRfxCwQwKHPQD
      можно написать код как угодно.;) я привёл один из вариантов как это сделать.
      если в функцию mc добавить условие if (mayGo) { тело функции; mayGo = false; } , а когда обнуляем скорости xmov ymov добавить mayGo = true; , то шар будет перемещаться по щелчку мыши только когда шар приедет в прошлую точку назначения. В общем, вот так:

      import flash.events.MouseEvent;
      import flash.events.Event;

      var speed = 5; //скорость шара ball
      var mx, my ; // координаты мыши в момент клика
      var xmov = 0; // скорость шара по х
      var ymov = 0; // скорость шара по У
      var mayGo = true;
      stage.addEventListener(MouseEvent.CLICK, mc);
      stage.addEventListener(Event.ENTER_FRAME, ef);

      //клик мыши по сцене
      function mc (e:MouseEvent) {
      if (mayGo) {
      // сохраняем координаты курсора в переменные
      mx = mouseX;
      my = mouseY;
      trace (“mx = “, mx, “my = “, my);
      // функция поиска скоростей
      findSpeed ();
      mayGo = false;
      }
      }

      // функция поиска скоростей
      function findSpeed () {
      var xdiff = mx – ball.x ;
      var ydiff = my – ball.y ;
      // угол между результирующим вектором и осью оХ
      var alfa = Math.atan2(ydiff, xdiff);
      trace (“угол = “, alfa*180/Math.PI);
      // скорости по х и у
      xmov = speed * Math.cos(alfa);
      ymov = speed * Math.sin(alfa);
      trace (“xmov =”, xmov, “ymov = “, ymov);
      }

      function ef (e:Event) {
      // временное положение шара в кадре
      ball.tempx = ball.x + xmov;
      ball.tempy = ball.y + ymov;

      // r1 – расстояние от центра шара до точки назначения в прошлом кадре
      var r1 = Math.sqrt((mx – ball.x)*(mx – ball.x) +
      (my – ball.y)*(my – ball.y));
      // r2 – расстояние от центра шара до точки во временном положении шара
      var r2 = Math.sqrt((mx – ball.tempx)*(mx – ball.tempx) +
      (my – ball.tempy)*(my – ball.tempy));

      // если расстояние в следующем кадре дальше от точки, значит шар пролетит через точку дальше, поэтому…
      if (r2 > r1) {
      // ставим шар в эту точку
      ball.x = mx;
      ball.y = my;
      // обнуляем скорости
      xmov= 0;
      ymov= 0;
      mayGo = true;
      }
      // передвигаем шар на величину скоростей
      ball.x += xmov;
      ball.y += ymov;
      }

  2. Дмитрий

    Спасибо тебе Евгений за такой развернутый ответ!
    Очень хорощий и полезный сайт, интересное, качественное видео!
    Буду дальше осваивать уроки!

  3. Тарас

    У меня такой вопрос, как сделать, чтобы шар после клика пришел в нужные координаты и остановился?

    Все то, что ты для меня писал, пока что для меня очень сложно чтобы самому разобраться.
    Как между собой соединить две функции. Исправь пожалуйста мою ошибку, у меня все наоборот.
    stop();

    ball.addEventListener(Event.ENTER_FRAME, apelsin);
    ball.addEventListener(MouseEvent.CLICK, mc);

    function mc (e:MouseEvent) {

    ball.x = 289;
    ball.y = 160;
    }

    function apelsin (e:Event)
    {
    ball.x += 1;

    }

  4. Тарас

    Немножко не так, мне нужно чтобы при клику на шар, он переместился в заданные координаты и остановился.
    (Случайно 2 раза отправил на другой странице)

  5. Юрий

    Здравствуйте, вы могли бы объяснить зачем нужно писать stop(); заранее спасибо.

    • admin

      это привычка уже :) Когда делаешь много кадров, а это практически всегда, и если не написать стоп, то начинаются проигрываться кадры как в мультике, а это не нужно, поэтому всегда пишется stop(); где-нибудь в начале кода (обычно в самой первой строке). В данном примере кадр всего один, поэтому стоп можно и не писать.

      • Юрий

        спасибо за ответ, но у меня есть еще один вопрос, почему во втором уроке нужно было создавать второй кадр?

  6. admin

    Если у тебя 1 кадр, код в 1 кадре: ты запускаешь ролик, выполняется код в 1 кадре и всё.

    Если у тебя много кадров, код в 1 кадре: ты запускаешь ролик, выполняется код в 1 кадре, проигрывается 2 кадр,3,4,5 и т.д., после последнего проигрывается снова первый и выполняется код 1 кадра, и так будет по кругу бесконечно.

    Если у тебя много кадров, код в 1 кадре и написано stop в 1 кадре: ты запускаешь ролик, выполняется код в 1 кадре и всё.

    Если у тебя 7 кадров, во 2 и 3 написан какой-то код, а в 4 написано стоп и функция enterframe: То ты запускаешь файл, проигрывается первый кадр, потом второй, и выполняется код из 2 кадра один раз, потом 3 кадр, и выполняется код из 3 кадра один раз, потом проигрывается 4 кадр, но т.к. написано стоп, то всё, будет активным только 4 кадр и выполняться код из этого кадра один раз. Если же есть функция enterframe, то она будет выполняться постоянно.

    По факту – шкала времени, это кадры для анимации, которые проигрываются со скоростью FPS (frames per seconds – кадров в секунду),
    а функция enterframe – это кадры для кода в этой функции, которые проигрываются с такой же скоростью FPS.

    Ответ на вопрос: второй кадр нужен был чтобы зациклить воспроизведение кода, 1,2,1,2,1,2.. и через один выполнялся код первого кадра. Если же не добавлять 2 кадр, то код первого кадра выполнился бы 1 раз и всё.

    • Юрий

      спасибо огромное за развернутый ответ!

  7. Михаил

    Привет, Евгений!
    прокомментируй, пожалуйста, развернуто вот эти строчки кода. все остальное я понял, а вот их никак
    // r1 – расстояние от центра шара до точки назначения в прошлом кадре
    var r1 = Math.sqrt((mx – ball.x)*(mx – ball.x) +
    (my – ball.y)*(my – ball.y));
    // r2 – расстояние от центра шара до точки во временном положении шара
    var r2 = Math.sqrt((mx – ball.tempx)*(mx – ball.tempx) +
    (my – ball.tempy)*(my – ball.tempy));

    • admin

      Привет, Майк.:)
      r1 – расстояние от центра шара до точки назначения в прошлом кадре Фактически это положение шара, которое у нас уже есть. И мы считаем расстояние от шара до точки куда ткнули мышкой.
      r2 – расстояние от центра шара до точки во временном положении шара. Мы не передвигаем шар, ball.tempx и ball.tempy – это какие координаты БЫЛИ БЫ, ЕСЛИ БЫ мы передвинули шар дальше!!!
      Зачем мы это делаем – чтобы шар не проехал дальше точки. Если расстояние до точки назначения в следующем кадре станут больше, чем есть сейчас, значит шар уже максимально близко к этой точки и тут его надо и оставить.
      По поводу Math.sqrt((mx – ball.x)*(mx – ball.x) + (my – ball.y)*(my – ball.y)); это Нахождение гипотенузы по теореме Пифагора. Корень квадратный из суммы произведений катетов, которые есть разность координат по Х и по У.

      • Михаил

        Спасибо, Евгений. теперь мне все стало понятно.
        ну и отдельное спасибо за твои видео уроки) в них все очень понятно, дикция хорошая, никакого занудства. для новичка именно то, что нужно))

Добавить комментарий для Дмитрий Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">