FlashWorld :: Flash и около

Monday, December 26, 2005

Создаем себе праздничное настроение. Снегопад во Флэше.

Зима. Скоро новый год. В моем городе снега уже достаточно. Но есть такие экземпляры городов, где функция Zima(); вызывается с аргументом snow=false :) Или, возможно, вы хотите, чтобы снег был не только на улице но и во Flash'e. Всё это исполнимо. Приступаем к исполнению...

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

Открываем Флэш, устанавливаем размеры сцены, фон и FPS (я ставил 25).
Рисуем снежинку. Особо мудрить не стоит, так как их будет много и за их индивидуальностью никто следить не будет. Я просто взял кисть и поставил ей точку - снежинка готова. Выделяем снежинку, тыцкаем F8, выбираем MovieClip. В панели свойств напишите её имя "sn", без кавычек. Всё, теперь приступаем к скрипту.
Это пишем в действиях муви-клипа снежинки:


onClipEvent(enterFrame){
//снежинка падает. random здесь стоит, чтобы
//снежинки обгоняли друг друга и каждая летела со
//своей скоростью. +3 после random'a для того, чтобы
//при значении 0 снежинка продвигалась хотя-бы на 3 пикселя,
//а то матрица какая-то получится...
this._y += random(6)+3;
//если снежинка улетела за нижний край экрана, возвращаем наверх.
//пусть снова падает :) И поменяем _x - чтобы снегопад менялся.
if(this._y > 400){
this._y = -5;
this._x = random(400);
}
//эти строчки пригодятся если вы будете делать "сдувание" снежинок:
if(this._x > 400){ this._x = 1}
if(this._x < 0){ this._x = 400}
}


Это всё. Теперь можете нажать CTRL-Enter и посмотреть как одна снежинка носится по экрану. Для снегопада нам понадобится чуть побольше снежинок чем одна. Конечно, можно их прямо сейчас скопировать и разбросать по эрану, но профессионалы так не делают :) Открываем Панель действий кадра. Пишем это:


i = 1 // переменная-счетчик. ставим начальное значение 1.
ii = 100 // кол-во снежинок. 100 - хватит.
while(i < ii){
//дублируем одинокую снежинку
_root.sn.duplicateMovieClip("sn"+i, i);
//задаем для новой снежинки координаты:
_root["sn"+i]._y = random(400);
_root["sn"+i]._x = random(400);
// и размер:
scale = random(50)+50
_root["sn"+i]._xscale = scale;
_root["sn"+i]._yscale = scale;
i++
}


Вот и всё. Теперь, нажав CTRL-Enter, можете наслаждаться полноценным снегопадом. Но и это не предел :) Просто наблюдать за снегом может быстро надоесть. Поэтому добавим долю интерактивности, чтобы пользователь мог поучаствовать. Сделаем, чтобы при движении мышкой влево снег "сдувало" влево, при движении вправо - "сдувало" вправо. Пишем здесь же, в действиях кадра.


// по движению мыши происходят такие события:
_root.onMouseMove = function(){
si = 1 // еще одна переменная-счетчик для еще одного цикла.
// с интервалом в 100 миллисекунд узнаем координату мыши и обзываем её oldm:
setInterval(function(){_root.oldm = _xmouse}, 100);
while(si < ii){
// если oldm < текущей координаты "сдуваем" снежинки вправо (опять random :)
if(_root.oldm < _xmouse){_root["sn"+si]._x+= random(3)}
// аналогично, только край экрана - левый и сдуваем в другую сторону:
else if(_root.oldm > _xmouse){_root["sn"+si]._x-=random(3)}
si++
}
}


Теперь вы можете уже в третий раз нажать CTRL-Enter. Получился довольно симпатичный снегопад. А если у вас по какой-то причине снегопада не получилось, то вот исходник. Счастливого Вам Нового Года!

Достоинства.
1. 510 байт! (в моем варианте)
2. Несильно грузит проц. При 100 снежинках загрузка была где-то 20-30%

Недостатки.
1. Снежинкам не хватает кружения и покачивания. Хотя в такой "толпе" это не так и заметно и необходимо.

Когда я искал скрипт снегопада, то нашел только два. Один с классами, автор George Forest, и другой на rastyle.com. Всё, найденное на других сайтах, было копиями этих двух примеров (см. предыдущий пост :)
Если кто-то видел другие хорошие примеры снегопада, киньте линк, посмотрю.

7 Comments:

  • At 4:03 AM, Anonymous Nirth said…

    боюсь показаться банальным. но всеже может имеет смысл отказаться от onClipEvent =)&

     
  • At 12:30 AM, Blogger Bright said…

    извиняюсь.
    просто так написал, мона было в цикле писать
    this["sn"+i].onEnterFrame=function(){
    //код
    }
    и где нибудь тоже самое написать для sn.
    дело вкуса :)

     
  • At 1:23 AM, Anonymous Майкл Клишин said…

    За onClipEvent надо отрывать руки. Научи так работать дизайнеров вокруг -- и потратишь еще полчаса на то, чтобы найти все их неработающие навески и собрать воедино. За onClipEvent надо отрывать руки.

     
  • At 1:35 AM, Blogger Bright said…

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

     
  • At 2:31 AM, Anonymous Anonymous said…

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

    да, в первый раз здесь, отличный сайт.

     
  • At 2:32 AM, Anonymous Anonymous said…

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

     
  • At 10:46 PM, Anonymous Anonymous said…

    Законно по юридическому договору оформим на частных лиц и сотрудников предприятий карты метро в сеть супермаркетов МETRO Cash & Cаrry:карточка metro с вашим фото(делается при вас в самом магазине METRO Cash & Carry) ,с личным номером,кодом,со специальной магнитной полосой, названием организации, от которой вы будете нами зарегистрированы и оформлены. Вы можете проводить с собой двух человек. Карточки metro оформляются: на граждан России и иностранных граждан.Оформление делается без предварительной оплаты, то есть вначале мы регистрируем вас,вы получаете карточки метро, потом оплачиваете. Оплата производится в течение одного рабочего дня после оформления через Сбербанк РФ ,торговые центры МETRO Cash and Cаrry работают круглосуточно.Срок действия карточки metro 3 года, по истечении этого срока договор перезаключается по взаимному согласию сторон.Для оказания этой услуги мы находим фирмы, у которых есть свободные места в этих гипермаркетах,и заключаем с ними соответствующие договора, по которым фирмы обязуются предоставить вам право пользоваться их местами в этих супермаркетах сроком на три года. Оформление и регистрация производятся в разных немецких гипермаркетах Метро Кэш энд Керри, по выбору юридических лиц в соответствии с их территориальным месторасположением. Получив карты метро в одном из немецких гипермаркетов Метро Кеш энд Керри вы можете ей пользоваться в любых других магазинах этой сети супермаркетов Метро Кеш энд Керри в России и за границей.
    [url=http://www.c-c-metro.ru/38-1.php ] КАК ОФОРМИТЬ КАРТУ КЛИЕНТА МЕТРО КЭШ ЭНД КЕРРИ ! Утюги ![/url]
    [url=http://www.c-c-metro.ru/23-2.php ] как достать карту магазина метро ! молотки долото ![/url]

     

Post a Comment

<< Home