Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 9:

Математика и физика Flash

Ускорение

В предыдущем упражнении мы рассматривали постоянную скорость. В реальных условиях, если на светофоре вы нажимаете на педаль газа, то скорость автомобиля не станет моментально равна 100 км/ч. При скорости 0 км/ч вы нажимаете педаль газа. По прошествии секунды скорость вашего автомобиля достигнет 5 км/ч, еще через секунду скорость будет равна 10 км/ч и т.д. Ваша скорость будет увеличиваться на 5 км/ч каждую секунду. Это увеличение скорости называется ускорением. В нашем примере ускорение равно 5 км/ч в секунду, т.к. каждую секунду скорость увеличивается на 5 км/ч. Довольно просто. Теперь попробуем применить это во Flash.

Увеличиваем скорость
  1. Откройте ваш фильм из предыдущего упражнения (если он еще не открыт). Расположите movieClip1 как можно левее на рабочем месте. Удалите весь имеющийся код в слое Actions и вставьте этот небольшой отрывок кода в кадр 1:
    var accel = .05;
      var velX = 0;
      movieClip1_mc.onEnterFrame = function() {
        this._x += velX;
        velX += accel;
      };
  2. Запустите фильм. Вы увидите, что фильм будет двигаться слева направо, постепенно ускоряясь по мере движения.

    Этот код довольно прост, но полезен. Мы постоянно обновляем переменную velX (и, следовательно, позицию _x movieClip1 ) значением переменной ускорения accel. По мере выполнения кода в каждом кадре скорость по направлению увеличивается, и наш объект ускоряется при движении слева направо.

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

    Если направление ускорения совпадает с текущей скоростью, эта скорость будет увеличиваться.

    Если ускорение направлено в противоположную сторону относительно скорости по направлению, оно уменьшит эту скорость. Если вы, двигаясь со скоростью 50 км/ч, включите задний ход и нажмете педаль газа, я гарантирую вам, что ваша скорость очень быстро уменьшится. Если двигатель и трансмиссия вашего автомобиля уцелеют, ваша скорость в итоге станет нулевой и затем отрицательной - вы поедете в обратную сторону. Безусловно, обычный автомобиль не предназначен для таких "трюков", поэтому если вы представите себе астронавта, который использует реактивные двигатели для управления движением корабля, вы сможете быстрее разобраться в физике происходящего.

    Каждая сила, которая изменяет позицию объекта, может быть интерпретирована как некое ускорение данного объекта. Двигатель автомобиля, ускоритель ракеты, гравитация, магнетизм, ветер - все это ускоряет объект в определенном направлении. Давайте рассмотрим одну из этих сил и применим ее во Flash. Мы будем моделировать эффект гравитации для фильма. Сначала выполним небольшое упражнение, чтобы уяснить принципы, на которых базируется эффект, а затем перейдем к более основательному проекту, в котором применим знания, полученные при создании игры Asteroids.

Гравитация

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

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

  2. Я уже говорил, что гравитация, как и всякая другая сила, ускоряет объект в определенном направлении. В каком направлении? Конечно вниз! Так как направления вниз и вверх лежат лишь на одной оси y, мы можем интерпретировать гравитацию как прибавления определенной скорости, направленной вниз по направлению y, т.е. velY. Это делается одной строкой в первом выражении if функции move.
    function move() {
      if   (!this.dragging) {
        this.velY += grav;
        this.velX*= friction;
        this.velY*= friction;
        this._x += this.velX;
        this._y += this.velY;
  3. Нам нужно также переместиться вверх и определить значение для grav в функции init.
    grav = 1;
  4. Запустите фильм. Зацепите шарик мышью и бросьте его. Вы увидите, как эффект гравитации влияет на скорость шарика.

    Здесь velY изначально равна 0, так как не имеет определения (Flash довольно милостив в этом отношении, так как многие другие языки восприняли бы это как ошибку), но затем к velY прибавляется 1, так как grav = 1. Итак, в начале фильма шарик начинает движение по направлению к низу экрана со скоростью 1. В каждом кадре значение velY увеличивается на 1, поэтому шарик ускоряется до тех пор, пока не окажется внизу экрана, отскакивает и затем меняет направление движения. Красиво, не так ли? Шарик начинает движение вверх, так как его скорость по направлению Y поменяла направление (стала отрицательной).

    Предположим, что в точке отскока шарик двигается со скоростью 20 пикселей в секунду в нижнем направлении. Он отскакивает, и значением velY становится -20, однако grav все еще прибавляет 1 к velY в каждом кадре. Таким образом, velY примет значения -19, -18, -17 и т.д. до тех пор, пока не обратится в ноль. grav все еще добавляет 1 (это происходит постоянно), поэтому шарик опять начнет движение вниз. Здесь происходит то же самое, что и при подбрасывании вверх реального предмета.

    Теперь в нашем багаже достаточно знаний. Совместим изученное в проекте Flash с движущимися объектами. Мы создадим старую школьную игру Atari Asteroids 1979 года.


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

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

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

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

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

Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009
Магомед Алисултанов
Магомед Алисултанов
Россия, Волгоград, лицей 2