Снег, сделанный с помощью action script, совсем не такой, как настоящий. Он тёплый, нежный и совсем не прогнозируется синоптиками:)
Сделать собственный программный снег очень просто.
Шаг 1
Рисуем прямоугольник шириной чуть больше чем ширина рабочей области (по высоте произвольный) и оборачиваем его в клип marker. Присваиваем ему Instancename c_begin.
Располагаем его над рабочей областью. Дублируем этот клип и ему присваиваем имя c_end. Его размещаем внизу, под рабочей областью. Выделяем эти два клипа и оборачиваем ещё в один клип container.
Шаг 2
Рисуем нашу снежинку. В нашем случае это комочек снега, нарисованный с помощью OvalTool с радиальной заливкой. Оборачиваем её в клип part, отметив галочкой ExportforActionScript и назначив класс PartClass:
Убираем part с рабочей области.
Шаг 3
Переходим внутрь клипа container и на новом слое в первом кадре пишем код:
var clip:MovieClip;
var t:Number, count:int = 0;
addEventListener(Event.ENTER_FRAME, Update)
function Update(e:Event){
if(++count%5 == 0){ // Каждый 5-йкадр
clip = new PartClass(); // Создаёмобьекткласса. (вместоduplicateMovieClip as2)
clip.x = Math.random()*c_begin.width; // случайнаяпозицияпо x
clip.y = c_begin.y;
clip.speed = 5;
clip.a = 1 + Math.random() * 1; // случайнаяамплитудаколебаний
clip.t = Math.random() * 10; // случайныйначальныйаргументсинуса
clip.scaleX = clip.scaleY = 0.6 + Math.random() * 0.5; // случайныйразмер
addChild(clip);
// каждойснежинкевешаемсвойобработчиксобытия
clip.addEventListener(Event.ENTER_FRAME, ClipUpdate);
}
}
function ClipUpdate(e:Event){
var clip:MovieClip = e.currentTarget as MovieClip;
clip.y += clip.speed * clip.scaleX; // заставляемснежинкупадать
clip.x += clip.a * Math.sin(clip.t); // добавляемколебанияпосинусу
// еслиснежинкадостиглаc_end, удаляемеё
if(clip.y>=c_end.y) {
clip.removeEventListener(Event.ENTER_FRAME, ClipUpdate);
removeChild(clip);
}
}
Запускаем:
Если сейчас немного раздвинуть края флешки так, чтобы были видны маркеры то увидим процесс формирования и уничтожения снежинок
Заменим комочки на снежинки из новогоднего клипарта.
Внутри символа part удаляем наш комочек и размещаем по кадрам снежинки. Слоем выше пишем строчку кода, которая отвечает за случайный выбор снежинки:
gotoAndStop((int)(Math.random()*totalFrames+1));
Вот так выглядит таймлайн:
Запускаем:
Чтобы сделать вообще круто, можно заставить снежинки вращаться. В основной код в Update дописываем:
clip.r = Math.random() * 10 - 5;
clip.rotation += clip.r;
Получаем вот такую красоту:
Можно ещё поиграться с 3D поворотом и, дописав в ClipUpdate такие две строчки:
clip.z += 3*clip.a * Math.sin(clip.t);
clip.rotationX = clip.rotationY = clip.rotationZ += clip.r;
получим нечто такое:
Ещё стоит отметить, что клип container можно крутить (в том числе и в 3D), изменять ему размер и т. д. При этом получаются красивые, неповторимые эффекты.
Автор урока: Андрей Барвинко
P.s. Добавлю от себя немножко снежных картинок: зимние истории от французcкого иллюстратора и аниматора Pascal Campion.
flash-animated.com
А есть ли возможность выложить тоже самое, но под html5? Была бы очень благодарна
Добрый день. Прекрасный урок, спасибо. Однако у меня сложился вопрос: файл проигрывается в swf прекрасно, снег падает. Но при экспорте/публикации ролика в gif, avi и т.д. - снега нет. Подскажите пожалуйста как вывести в такие форматы, но чтобы все сохранилось!
Доброго времени суток.Я в этих делах-новичок.Но хочу научиться,как эту красоту делать.Вообще ничего не получается.Всё делаю,как написано,а выдаёт ошибки:
Символ "container", слой "@", кадр 1, строка 9 1120: Обращение несуществующего свойства c_begin.
Символ "container", слой "@", кадр 1, строка 10 1120: Обращение несуществующего свойства c_begin.
Символ "container", слой "@", кадр 1, строка 26 1120: Обращение несуществующего свойства c_end.
Не всё делаете как написано... Судя по ошибкам - просто забыли назначить клипу Instancename. Будьте внимательны!)
Назначила,но наверное не то что нужно.Сейчас буду снова пытаться что-то лепить.Спасибо за подсказки.
Если всё назначено - значит код прописали не туда.
Удачи!)
а куда же его тогда записывать,-эх,-всё так сложно и запутано...буду пробовать...
Всем привет...а кто подскажет...для проги Sothink SWF Quicker какой скрипт нужен...заранее спасибо всем...
Урок классный,спасибо)
У меня вопрос, мои снежинки падают только с правой стороны,как сделать так ,что бы снежинки падали равномерно?))))
Здравствуйте!
Без исходника трудно сказать в чём проблема. Начальное положение снежинки задаётся в этой строчке clip.x = Math.random()*c_begin.width; и зависит от размеров клипа c_begin.
Надеюсь у вас всё получится. С наступающими праздниками!)
Спасибо за урок, у меня 2 вопроса. 1 Как увеличить количество снежинок появляющихся за кадр. 2 При низкой скорости снежинки разлетаются конусом, как уменьшить нижнюю часть конуса, заранее спасибо
Если Вас не затруднит записать видео как сделать этот урок,я буду очень благодарен...
Просто я только начинаю работать с адоб флеш...
Здравствуйте.
Вряд ли сейчас получится записать видео. Попробуйте разобраться так, ведь тут понятно написано, плюс есть исходник.
1) Уберите условие if(++count%5 ==
. Если нужно ещё больше - выполняйте в цикле эту функцию (Update) несколько раз.
2) Не совсем понял каким конусом) Снежинки колеблются по синусу. Поиграйтесь с числовыми значениями, возможно вы имели ввиду амплитуду clip.a = 0.2 + Math.random() * 0.2; ?
Я могу вам как ни будь файл отправить? Вы бы увидели и все поняли. И второй вопрос, как сделать что-бы снежинки появлялись не сверху контейнера, а по всей площади.
Ну так залейте на какой нибудь файлообменник или в облако и скиньте ссылку.
Для того, чтобы изначально заполнить экран снежинками нужно написать отдельную функцию по типу Update, только случайное заполнение нужно делать и по x и по y, а потом в цикле выполнить эту функцию, скажем 1000 раз.
http://yadi.sk/d/_56BssWRBqop4 образец, по задумке это будет пыль в объемном свете. Да забыл сказать я в программировании не очень хорошо разбираюсь, точнее не разбираюсь совсем.
Ну если не хотите разбираться, то наложите просто маску на клип с пылинками и всё) Но, как не странно, у меня снежинки нормально летят, не разлетаясь по сторонам. Вот, смотрите)
От скорости зависит, чем ниже тем больше разлет. Так и сделал, спасибо за помощь.
А, ой, упустил этот момент) На здоровье)
извиняюсь, а как снежинки из клипарта вставить? Они в архиве, там еще какие-то папки внутри...
чтобы их открыть вам нужно установить иллюстратор (файлы в .ai и .eps). а затем копипастом во флеш перенести
Очень неплохие примеры. Чем-то напомнило мне это - http://flashmaster.org.ua/post/104. Хотя выглядит несколько иначе. Кстати не знал про случайные вывод снежинки как в том примере.
Всё, разобрался сам=)
NiTRoEx
Урок конечно хороший, но не могу понять куда сам код вставить?
NiTRoEx
Здраствуй народ! Скажите где можно скачать программу AS3, но новичок в этом деле! Искал в интернете, но не нашел!
as3 - язык программирования в программе adobe flash
http://ru.wikipedia.org/wiki/ActionScript
значит плохо искали
сначала разберитесь, что Вы ищете
моя радость тут ))) http://leetovetz.deviantart.com/gallery/
Спасибо! Очень познавательная статья.
Хотел спросить по поводу параметров клипа:
clip.speed
и
clip.a
Разве у MovieClip существуют такие параметры! В коде мы их нигде не определяем. Откуда они берутся?
Прекрасный вопрос.
Это чудесное свойство AS3, которое я открыл для себя не так давно. Если коротко: класс, назначенный объекту - генерируется автоматически. И если мы его не сохранили в папку с проектом, то все новые поля добавятся по мере их поступления)) Программисты рекомендуют сохранять файл с классом на диск и прописывать нужные поля, чтобы не возникало таких вот вопросов.
Не знал этого. Теперь все понятно. Спасибо.
Все гораздо сложнее.
В доках к MovieClip написано следующее:
public dynamic class MovieClip
Тут ключевое слово dynamic -- оно означает что мы можем добавлять произвольные свойства к объекту, компилятор не будет ругаться на это, а в момент выполнения программы нам за это ничего не будет (не будет эксепшинов)
Если в описании класса нет этого слова, то компилятор нам не даст скомпилировать данный код. Если же мы "хаками" (myClassInstance["myUnknownProperty"] = 1) попытаемся обратится к такому свойству в момент выполнения программы, то поймаем эксепшин.
Например Sprite описан как public class Sprite. И с ним такие трюки не пройдут.
Ага, с не динамическими классами не пробовал. Спасибо за бдительность!
Ах, какие картинки! Нет слов.
Красота неописуемая. Супер. Спасибочки.
моя радость тут ))) http://leetovetz.deviantart.com/gallery/
Здорово)
Только в 1 и 22 строчках нет пробела между словами (varclip).
Так что у кого выдаёт ошибку, исправьте на: var clip
спасибо большое, поправила!
О, Спасибо за подробный код! Это ж сколько всего можно сделать: заменить снежинки на всёчтоугодно_дажесанимацией, поменять направление, скорость... Спасибо пребольшое!
Что бы вы сделали, если бы точно знали что всё получится?...