Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Уроки по PHP, Javascript и т.п.
Ответить
Аватара пользователя
ChineseBeemaster
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02

Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение ChineseBeemaster »

Изображение

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

И потом дошло - здания стоят, а у них дым застыл :)

Стал я копаться, как же его запустить то … и запустил :)

Попробуем на простом примере.

1. Откроем Flash (у меня CS5.5)
2. Создадим новый документ Action Script 3.0
3. Вставим туда какую-нибудь картинку дома с трубой
4. Создадим новый документ Action Script 3.0 Class
5. Вставим туда следующий код (сохраним как Smoke.as)

Код: Выделить всё

 package {    import flash.display.*;    import flash.events.*;    import flash.filters.*;    import flash.utils.*;        /**     * ...     * @author Maksim Naumov     */    public class Smoke extends Sprite     {        // Родительский контейнер для дыма        private var smokeMC: MovieClip = new MovieClip();        // Цвет дыма        private var color: uint;        // Радиус частичек дыма        private var puffRadius: Number = 1;        // Фильтр размытости для дыма        private var puffBlur:BlurFilter = new BlurFilter(8, 8, 2);        // Количество частичек дыма        private var puffCount: Number = 40;        // Таймер        private var timer: Timer = new Timer(100);                // --------------------------------------------------------------------------        public function Smoke(x: Number, y: Number, _color: uint, _count: Number = 40)         {            smokeMC.x = x;            smokeMC.y = y;            addChild(smokeMC);                        // Цвет дыма            color = _color;            // Кол-во частичек            puffCount = _count;                        timer.start();            timer.addEventListener(TimerEvent.TIMER, startSmoke);        }        // --------------------------------------------------------------------------        private function startSmoke(event: TimerEvent) : void        {            // Если количество частичек больше чем задано            if (smokeMC.numChildren > puffCount)            {                timer.stop();                timer.removeEventListener(TimerEvent.TIMER, startSmoke);            }            smokeMC.addChild(smokePuffss());        }        // --------------------------------------------------------------------------        private function smokePuffss() : Sprite        {            var smokePuff: Sprite = new Sprite();            // Случайная позиция от -2 до +2            var randX: Number = -2 + Math.random() * 4;                        // Рисуем            smokePuff.graphics.beginFill(color);            smokePuff.graphics.drawCircle(randX, 0, puffRadius);            smokePuff.graphics.endFill();            // Применяем фильтр размытия            smokePuff.filters = [puffBlur];                        smokePuff.addEventListener(Event.ENTER_FRAME, moveUp);                        return smokePuff;        }        // --------------------------------------------------------------------------        private function moveUp(event: Event) : void        {            // Если частичка дыма видна            if (event.currentTarget.alpha > 0)            {                // Вверх                event.currentTarget.y -= 1;                // Вширь                event.currentTarget.width += 0.5;                // Ввысь                event.currentTarget.height += 0.3;                // Прозрачность                event.currentTarget.alpha -= .004;            }            else            {                // Если частица невидимая, Y = 0 , X - не менять или 0, ширину и высоту - оригинальномая, а альфу = 1                event.currentTarget.y = 0;                event.currentTarget.width = puffRadius;                event.currentTarget.height = puffRadius;                event.currentTarget.alpha = 1;            }        }        // --------------------------------------------------------------------------    }} 
6. Вернемся к документу с картинкой выбираем первый кадр и жмем F9 (или Window -> Actions)
7. В открывшемся окне вставляем этот код (первые 2 значения координаты я их выяснил опытным путем, у вас будут свои)

Код: Выделить всё

 import Smoke; var smoke: Smoke = new Smoke(230, 130, 0xBBBBBB); addChild(smoke); 
Как это работает смотрим здесь http://some-one.ru/smoke_test/smoke_test.html
Исходник качаем здесь http://some-one.ru/smoke_test/smoke_test.zip

Вопросы наверно здесь можно задать ...

Спасибо за внимание
Аватара пользователя
ChineseBeemaster
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение ChineseBeemaster »

У кого-нить есть идеи как дым сдувать ветром, чтобы он шел вертикально ... именно к этому уроку? :)
Аватара пользователя
ChineseBeemaster
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение ChineseBeemaster »

Ладно сам сделал :))))

в переменные класса добавляем

Код: Выделить всё

         // Смещение (дуновение ветра) null - выключен, right - право, left - лево        private var puffWind: String = null; 
конструктор меняем на

Код: Выделить всё

         public function Smoke(x: Number, y: Number, _color: uint, _wind: String = 'right', _count: Number = 40)  
и меняется ф-ция

Код: Выделить всё

         // --------------------------------------------------------------------------        private function smokePuffss() : Sprite        {            var smokePuff: Sprite = new Sprite();            // Случайная позиция от -2 до +2            var randX: Number = -2 + Math.random() * 4;                        // Ветер            if (puffWind != null)            {                switch (puffWind)                {                    case 'right': // право                        randX += 3;                        break;                    case 'left': // лево                        randX -= 3;                        break;                }            }                        // Рисуем            smokePuff.graphics.beginFill(color);            smokePuff.graphics.drawCircle(randX, 0, puffRadius);            smokePuff.graphics.endFill();            // Применяем фильтр размытия            smokePuff.filters = [puffBlur];                        smokePuff.addEventListener(Event.ENTER_FRAME, moveUp);                        return smokePuff;        }        // -------------------------------------------------------------------------- 
Oxya
Сообщения: 2
Зарегистрирован: 19 ноя 2011, 20:46

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение Oxya »

подскажите как остановить этот дым? мне нужно чтобы он шел, пото переставал секунд на 10, а потом начинал идти снова. Заранее спасибо
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение 112 »

Код: Выделить всё

            removeChild(smokeMC); 
чтобы убрать дым подойдет?
Oxya
Сообщения: 2
Зарегистрирован: 19 ноя 2011, 20:46

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение Oxya »

Спасибо остановить получилось. может еще подскажите как сделать так, чтобы дым шел не с низу вверх, а слева на право из нижнего левого в верхний правый угол.
POGROMIST
Сообщения: 1
Зарегистрирован: 18 ноя 2012, 01:03

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение POGROMIST »

Oxya
снизу вверх это отнимать координаты по "Y", а если наискось в правый угол то значит одновременно отнимать "Y" и прибавлять "X" ну это же элементарно!
В switch добавить

Код: Выделить всё

 case 'Btr': //       randX += 3;randY-=3;                       //чисто эту строчку        break;
Guffi
Сообщения: 1
Зарегистрирован: 09 дек 2012, 23:09

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение Guffi »

Хочу предложить свой эффект реалистичного дыма flashyroki.ru/dim.html или эффект пара flashyroki.ru/hot_cup.html
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение Alazaur »

Guffi, у автора топика вариант на много лучше, чем оба вами показанные, хотя и у него есть что допилить. А вообще пора давно на AS3 переходить.То что сами не хотите переходить на более правильный стиль программирования дело ваше, но зачем людям давать такие вот вредные уроки... Это лично мое мнение и не претендует на правильное, но я против их появления на свет.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Как сделать реалистичный эффект дыма во Flash (AS3)? + исход

Сообщение sanych_dv »

Как это ни парадоксально, мне иногда приходится пилить баннеры/заставки/элементы интерфейса на сайты в AS2. Заказчики просят +HTML5 версию, а более-менее внятный конвертер Google Swiffy работает только с AS2.
Ответить