155 (+1)

Падал новогодний снег

Как создать реалистичный снег на Flash
Общий алгоритм поведения снежинок
Пошаговое руководство для создания Flash-открытки

Поиск по сайтуДля желающих написать письмоПослать ссылку другуВерсия для распечатки




Часть III

Функции расчета и отрисовки снежинок

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

Как Вы, наверное, знаете, любой объект обладает свойствами, изменяя которые мы можем влиять на его внешний вид и расположение. В случае создания мультфильма вручную Вы указываете значения этих параметров в панели "Properties". Если же нам необходимо изменять значения программно, то для этих случаев в ActionScript существует функция setProperty(), синтаксис которой следующий:

setProperty(target:Object, property:Object, value/expression:Object),

где

  • target - имя объекта, который мы собираемся изменить
  • property - название изменяемого параметра
  • value/expression - новое значение или вычисляемое выражение, присваиваемое выбранному параметру

Эта функция нам понадобятся, когда мы приступим к отрисовке нашего снегопада.


Функция расчета нового местоположения и размеров снежинок



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

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                Функция расчета нового положения снежинок                  //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function calculate_snowflakes() {

    for (i=0; i<num_snowflakes; i++) {

        // Вычисляем новый размер снежинки
        size = random(2*snowflake_size_shift)-snowflake_size_shift;
        
        // Корректируем параметры снежинки
        snowflakes[i][0] += wind_x_speed + random(2*snowflake_x_shift)
                          - snowflake_x_shift;
        snowflakes[i][1] += snowflake_y_gravity + random(2*snowflake_y_shift)
                          - snowflake_y_shift;
        snowflakes[i][2] += size;
        snowflakes[i][3] += size;
        snowflakes[i][4] += random(2*snowflake_alpha_shift)-snowflake_alpha_shift;

        // Корректируем снежинки, которые вышли за пределы снегопада
        if (snowflakes[i][0] < 0 || snowflakes[i][0] > snow_width || 
            snowflakes[i][1] < 0 || snowflakes[i][1] > snow_height ||
            snowflakes[i][4] < snowflake_alpha_shift ||
            snowflakes[i][2] < snowflake_size_shift) {
        
            // Генерируем новые параметры для снежинок
            snowflakes[i][0] = random(snow_width);
            snowflakes[i][1] = random(snow_height);
            snowflakes[i][2] = snowflake_width+size;
            snowflakes[i][3] = snowflake_height+size;
            snowflakes[i][4] = 30 + random(70);
        }
    }
}

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


Функция отрисовки снежинок



Как вы помните, когда мы создали объект "snow", мы повесили на него обработку события onClipEvent(enterFrame). Данное событие вызывается каждый раз, когда передается управление данному мувиклипу. Мы используем настройки мультфильма по умолчанию, поэтому данное событие будет вызываться 12 раз в секунду и запускать функцию отрисовки снежинок.

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//                        Функция отрисовки снежинок                         //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

function draw_snowflakes() {

    // Рассчитываем новое положение снежинок
    calculate_snowflakes();

    for (i=0; i<num_snowflakes; i++) {

        // Меняем параметры снежинки
        setProperty(snow["snowflake_"+i],_x,snowflakes[i][0]);
        setProperty(snow["snowflake_"+i],_y,snowflakes[i][1]);
        setProperty(snow["snowflake_"+i],_width,snowflakes[i][2]);
        setProperty(snow["snowflake_"+i],_height,snowflakes[i][3]);
        setProperty(snow["snowflake_"+i],_alpha,snowflakes[i][4]);
    }
}

Первым делом мы рассчитываем новое положение снежинок, а затем производим корректировку параметров, используя функцию setProperty(), которую я описал выше. Все встроенные в объект атрибуты начинаются со знака подчеркивания "_". Полный список атрибутов может быть очень большим и зависит от конкретного объекта. В нашем же случае достаточно знать атрибуты, описывающие координаты объекта (_x, _y), его ширину и высоту (_width, _height), а также степень прозрачности (_alpha). Именно их мы и корректируем при отрисовке снежинок.


Часть 1Часть 2Часть 3 - ее Вы читаете сейчасЧасть 4


Свои мнения, пожелания и вопросы по выпускам Вы можете присылать по адресу mike@cherry-design.ru.
Я оставляю за собой право цитировать письма, пришедшие по вышеуказанному адресу.
Copyright © 2001-2008 Михаил Мельников. Перепечатка без разрешения запрещена.