Эффект взрыва

06.04.2008, автор Stormit, рубрики: ActionScript, Flash игры, Игровые баннеры

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

Основой большинства спецэффектов во флэше, является функция duplicateMovieClip. До появления програмного рисования и объекта BitmapData, это был чуть ли не единственный способ программирования flash-эффектов. Эта функция просто создает дубликат уже существующего клипа. В нашем случае, мы создаем набор дубликатов и дальше управляем ими по ситуации.

Сделав более 500 игровых баннеров, я заметил, что некоторые эффекты часто переходят из одной работы в другую и практически без изменений. Самый популярный среди них - эффект взрыва / брызг / осколков.

Рзберемся, как это делается (я еще не разобрался с аудиторией сайта, поэтому буду разжевывать) + пример ниже:

  1. Рисуем произвольную частицу (это форма нашего осколка), оборачиваем ее в символ (назовем его part).
  2. Еще раз оборачиваем part в символ (назовем его partGo) и внутри него делаем анимацию, как символ part улетает вправо постепенно уменьшаясь (например за 15 кадров).
  3. Помещаем partGo еще в один символ (назовем его boom). Заходим обратно в символ boom и в кадре пишем такой код:
    partGo._visible = false; //скрываем эталонный символ
    i = 30;
    while (i--) {
    	d = partGo.duplicateMovieClip("p" + i, i); //делаем дубликат
    	d._rotation = Math.random() * 360; //какой сектор покрываем
    	d._xscale = d._yscale = Math.random()*70 + 50; //добавляем реализм
    }
  4. Сейчас эффект есть, но выполняется циклично. Hам нужно только один раз, поэтому отрабатываем удаление. Спускаемся в символ partGo, добавляем 16-й (в нашем случае) пустой кадр и пишем в нем:
    _parent.removeMovieClip();//удалит клип boom если он добавлен программно
    stop();//просто остановит анимацию, если клип добавлен руками
  5. Готово! Наш символ boom можно помещать в любую анимацию и он отыграет свои 15 кадров и остановится. Если этот символ должен добавляться на сцену программно, то на линейку где лежит клип boom, нужно добавить код:
    boom._visible = false;
    lev = 0;
    function placeBoom(x, y){
    	lev++;
    	var d = boom.duplicateMovieClip("b" + lev, lev);
    	d._x = x;
    	d._y = y;
    }
    placeBoom(Math.random()*200, Math.random()*200);//ложим в случайное место
  6. Это основное, дальше клип boom можно наворачивать: добавить вспышку огня, лучи света, мерцание осколков, добавить растр, еще пофантазировать.

Теперь сохраняем полученный клип boom, и используем его по жизни сколько угодно раз. Стоит перерисовать форму частицы part, он легко превращается в любой boom-эффект, когда летят щепки, осколки, слюни, грязь, кровь, брызги и еще что-то разлетающееся в разные стороны.

Интересно на 22%

(47) Хитрых на тему «Эффект взрыва»

  1. Алексей

    Урок супер! То что искал:) Респект тебе! Только расскажи, пожалуйста, чайнику, как ты эти “облака” в центральном примере нарисовал

  2. Stormit

    Это легко. В фотошопе, в стандартном наборе кистей, выбери с именем Spatter. В настройках кисти лучше задать случайный угол поворота. И кликни пару раз :)
    обрежь по габаритам и экспортни как PNG.

  3. Саша

    Спасиба за урок!
    оч. интересно и полезно
    и Красиво:)

  4. Костя

    Огромное спасибо, брожу по сайту и ненарадуюсь

  5. DF

    Чёйто я не разобрался, как сделать 5/6. Подскажите плиззз

  6. Лика

    Он мне после первого кода выдает ошибку в первых трех строчках :(
    Что значит Statement must appear within on/onClipEvent handler?

  7. Адександр

    **Error** Symbol=boom, layer=Layer 1, frame=1:Line 1: Statement must appear within on/onClipEvent handler
    partGo._visible = false;

    **Error** Symbol=boom, layer=Layer 1, frame=1:Line 2: Statement must appear within on/onClipEvent handler
    i = 30;

    **Error** Symbol=boom, layer=Layer 1, frame=1:Line 3: Statement must appear within on/onClipEvent handler
    while (i–) {

    Total ActionScript Errors: 3 Reported Errors: 3

    Подскажите что нужно сделать?

  8. Stormit

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

  9. Костя

    Замечательно. О таком способе использовать команду дублирование думал, но не получалось. Прояснили сознание. Непонятно лишь как сделать разноцветные мувики.

  10. MCTRE

    полезная вещь!!!!!!!

  11. Nutich

    Почему-то не работает код, выдает след ошибку:

    1119: Access of possibly undefined property partGo through a reference with static type flash.display:DisplayObject.

    В чем у меня ошибка?? помогите, плиизз!

  12. Stormit

    Вероятно вы используете AS3, а этот код написан на AS.

  13. noode

    вот создал анимацию, создал клип boom, ввел код…. вообще ничего не поменялось

  14. Stormit

    В 3-м шаге код нужно писать внутри символа boom в кадре.

  15. Робо

    Уроки классные но почему то у меня не работают ((( просто проигрывается анимацыя летящего осколка и останавливается

  16. kingslayer

    Вопрос такой, во флэше 8 есть эффект таймлайн взрыв(explode) а в adobe flash cs 4 нет. может он спрятан? или взрыв теперь только программно делать?

  17. Stormit

    Наверное не зря его убрали, выглядел он не очень качественно и много весил при экспорте. А способов сделать взрыв целая куча: от покадровой анимации, через анимации в клипах типа Graphic до программного движения. Уверен, у каждого на этот счёт есть свой способ :)

  18. PREDATOR

    Спасибо!!!! Сам недавно начал изучать флеш, очень классная тема :)))

  19. Илья

    Робо - у меня так же было, пока я не написал имена клипов и в «instance name»
    (в настройках)

    Спасибо за урок! Спасибо за разжевывание — я уверен, от этого аудитория сайта будет шире :)

  20. snet

    Илья, у меня такая же проблема как и у Робо, и в «instance name» я ввел имена partgo, boom и тд, всеравно неполучается. Просто показывается анимация , как будто код невидит, а вроде все правильно сделал.

  21. Stormit

    Проверяйте функцией trace() какой клип или свойство теряется (обычно выводит NaN или Undefined). Без этого сложно что-то советовать.

  22. Роман

    Огромезное спасибо Вам, очень хорошие уроки… все доходчиво и красиво.

  23. Alexsey

    ммм, проблема как у Робо, проигрывается анимация части partGo и останавливается а вот код символа boom почемуто не учитывается… тоесть никакой реакции на него, и где этот «instance name», у меня просто 8 flash русскийи я недавно его изучать начал, заранее спасибо

  24. Blind

    Разжуйте пожалуйста Шаг 3. Ничего не получается :(
    Я вот второй день только занимаюсь …
    Поставил CS 4? там нет выбора простого AS> Только 2 и 3. мб поэтому и не так все …

    Помещаем partGo еще в один символ (назовем его boom) - это то же самое что оборачиваем xxx в символ … или как то по-другому? Или создаем Символ Boom а потом из библиотеки перетаскиваем partGo? Темный лес :) оО Может и тут я не так что-то мудрю …

  25. levati

    2Blind - Проект делайте в АС2, не забудьте продублировать имя в поле InstanceName для символа partGo.

    2Stormit - спасибо, очень занимательно.

  26. error111

    Stormit,
    извините, а нельзя ли выложить fla к данному уроку? А то я что-то запутался куда какой кусок кода предлагаете положить.

  27. Виктор

    Ответ для тех, у кого получается только движение одной частицы.Проверено в CS4 на As2

    пункт 2:
    “Еще раз оборачиваем part в символ (назовем его partGo) и внутри него делаем анимацию, как символ part улетает вправо постепенно уменьшаясь (например за 15 кадров).”
    Анимация создаётся не в символе partGo, а в part (тоесть в самом последнем).
    попробуйте. У меня всё заработало

  28. Роман

    [quote]Анимация создаётся не в символе partGo, а в part (тоесть в самом последнем).
    попробуйте. У меня всё заработало[\quote]

    ИМХО это вы что-то намутили раз анимация создаеться у вас в частице!!

  29. Виктор

    эмм согласен Роман, намутил. в символе partGo нужно.

  30. Анна

    подскажите пожалуйста, как вы сделали, чтобы этот взрыв проигрывался по нажатию мышкой в любом месте флешки?

  31. Анна

    ps: просто очень надо сделать так, чтобы взрыв был при нажатии на кнопку

  32. saintist

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

  33. KIFDRAKON

    1120: Access of undefined property partGo.
    урок интересный но мои лыжи напрочь застряли.
    где можно увидеть исходник урока чтобы разобраться что я не туда пишу

  34. Павел

    Привет.. прикольный урок. Немогли бы вы сделать тоже самое на as3… а можно попросить пример FLA файла?

  35. Павел

    как мне использовать swf этот.. в моем ролике на as3?

  36. saintist

    >> Павел

    //–Немогли бы вы сделать тоже самое на as3… а можно попросить пример FLA файла?

    очень смешно ))

    в примере все расписано, в AS3 делается точно также но со спецификой AS3

    //–как мне использовать swf этот.. в моем ролике на as3?

    подгружаешь и используешь, но не лучше ли написать свое ?

  37. KIFDRAKON

    да я и так под себя переделаю. кто вкурил тому не проблема.
    но нужно понять где лыжи не едут.

  38. Jazzcat

    Огроменное спасибо за ваш труд! Нашел кучу всяких полезностей!

  39. mmc

    хм….а у мну почему-то не получилось…один камень только летает и всё….запиши видео или флешку как сделать…..))

  40. Budven

    Огромное спасибо за такой урок! Автору - респектище! Создателю блога - мегауважуха! Сайт безумно интересный и необычный!

    Как для такого эфекта - слишком простое решение))) Я бы там голову ломал и делал бы все через ж. Просто еще опыта малова-то!

    Еще раз спасибо)

  41. teplo1996

    Ребята, ну реально не понятно какой символ в каком(
    Где писать скрипты. Выложите *.fla - у кого получилось, проявите снисходительность)
    Мне бы зацепиться за базу, дальше я раскопаю)
    teplo1996@rambler.ru

  42. AZ

    Все понятно и замечательно!
    А что написать, чтобы взрыв происходил при определенном условии?

  43. Prince

    /*AZ
    “Все понятно и замечательно!
    А что написать, чтобы взрыв происходил при определенном условии?”
    */
    Прописываеш условие
    if(”условие”){
    play;
    }
    чтото вроде етого

  44. LjoXA (beginer)

    На щёт «instance name» вот вам ссылочка, прочитайте всё внемательно и у вас получится
    http://flash.by/article_read.asp?id=98

  45. Матвей

    Не могу понять…В 5 пункте написано “на линейку где лежит клип boom, нужно добавить код”, на какую линейку? Скажите пожалуйста.

  46. serdeles

    А как сделать, чтобы эффект срабатывал по клику мышкой в любом месте сцены? Как в примере № 5?

  47. randomGuy

    Интересный фокус! Сейчас переведу в AS3 и беру на вооружение ) Спасибо!

Оставить комментарий