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

Уроки по PHP, Javascript и т.п.

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

Сообщение ChineseBeemaster » 08 сен 2011, 20:31

Изображение

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

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

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

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

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

  1.  package
  2. {
  3.     import flash.display.*;
  4.     import flash.events.*;
  5.     import flash.filters.*;
  6.     import flash.utils.*;
  7.    
  8.     /**
  9.      * ...
  10.      * @author Maksim Naumov
  11.      */
  12.     public class Smoke extends Sprite
  13.     {
  14.         // Родительский контейнер для дыма
  15.         private var smokeMC: MovieClip = new MovieClip();
  16.         // Цвет дыма
  17.         private var color: uint;
  18.         // Радиус частичек дыма
  19.         private var puffRadius: Number = 1;
  20.         // Фильтр размытости для дыма
  21.         private var puffBlur:BlurFilter = new BlurFilter(8, 8, 2);
  22.         // Количество частичек дыма
  23.         private var puffCount: Number = 40;
  24.         // Таймер
  25.         private var timer: Timer = new Timer(100);
  26.        
  27.         // --------------------------------------------------------------------------
  28.         public function Smoke(x: Number, y: Number, _color: uint, _count: Number = 40)
  29.         {
  30.             smokeMC.x = x;
  31.             smokeMC.y = y;
  32.             addChild(smokeMC);
  33.            
  34.             // Цвет дыма
  35.             color = _color;
  36.             // Кол-во частичек
  37.             puffCount = _count;
  38.            
  39.             timer.start();
  40.             timer.addEventListener(TimerEvent.TIMER, startSmoke);
  41.         }
  42.         // --------------------------------------------------------------------------
  43.         private function startSmoke(event: TimerEvent) : void
  44.         {
  45.             // Если количество частичек больше чем задано
  46.             if (smokeMC.numChildren > puffCount)
  47.             {
  48.                 timer.stop();
  49.                 timer.removeEventListener(TimerEvent.TIMER, startSmoke);
  50.             }
  51.             smokeMC.addChild(smokePuffss());
  52.         }
  53.         // --------------------------------------------------------------------------
  54.         private function smokePuffss() : Sprite
  55.         {
  56.             var smokePuff: Sprite = new Sprite();
  57.             // Случайная позиция от -2 до +2
  58.             var randX: Number = -2 + Math.random() * 4;
  59.            
  60.             // Рисуем
  61.             smokePuff.graphics.beginFill(color);
  62.             smokePuff.graphics.drawCircle(randX, 0, puffRadius);
  63.             smokePuff.graphics.endFill();
  64.             // Применяем фильтр размытия
  65.             smokePuff.filters = [puffBlur];
  66.            
  67.             smokePuff.addEventListener(Event.ENTER_FRAME, moveUp);
  68.            
  69.             return smokePuff;
  70.         }
  71.         // --------------------------------------------------------------------------
  72.         private function moveUp(event: Event) : void
  73.         {
  74.             // Если частичка дыма видна
  75.             if (event.currentTarget.alpha > 0)
  76.             {
  77.                 // Вверх
  78.                 event.currentTarget.y -= 1;
  79.                 // Вширь
  80.                 event.currentTarget.width += 0.5;
  81.                 // Ввысь
  82.                 event.currentTarget.height += 0.3;
  83.                 // Прозрачность
  84.                 event.currentTarget.alpha -= .004;
  85.             }
  86.             else
  87.             {
  88.                 // Если частица невидимая, Y = 0 , X - не менять или 0, ширину и высоту - оригинальномая, а альфу = 1
  89.                 event.currentTarget.y = 0;
  90.                 event.currentTarget.width = puffRadius;
  91.                 event.currentTarget.height = puffRadius;
  92.                 event.currentTarget.alpha = 1;
  93.             }
  94.         }
  95.         // --------------------------------------------------------------------------
  96.     }
  97. } 


6. Вернемся к документу с картинкой выбираем первый кадр и жмем F9 (или Window -> Actions)
7. В открывшемся окне вставляем этот код (первые 2 значения координаты я их выяснил опытным путем, у вас будут свои)

  1.  import Smoke;
  2.  
  3. var smoke: Smoke = new Smoke(230, 130, 0xBBBBBB);
  4.  
  5. addChild(smoke)


Как это работает смотрим здесь http://some-one.ru/smoke_test/smoke_test.html
Исходник качаем здесь http://some-one.ru/smoke_test/smoke_test.zip

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

Спасибо за внимание
Программист: PHP+MySQL, Java, AS, Мой skype: chinese.beemaster

За это сообщение автора ChineseBeemaster поблагодарили - 3:
Александр, Евгений, Joseph Jevelin
Аватара пользователя
ChineseBeemaster

 
Автор темы
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02
Откуда: Минск, Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение ChineseBeemaster » 21 сен 2011, 23:27

У кого-нить есть идеи как дым сдувать ветром, чтобы он шел вертикально ... именно к этому уроку? :)
Программист: PHP+MySQL, Java, AS, Мой skype: chinese.beemaster
Аватара пользователя
ChineseBeemaster

 
Автор темы
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02
Откуда: Минск, Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.

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

Сообщение ChineseBeemaster » 21 сен 2011, 23:53

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

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


конструктор меняем на
  1.  
  2.         public function Smoke(x: Number, y: Number, _color: uint, _wind: String = 'right', _count: Number = 40)
  3.  


и меняется ф-ция
  1.  
  2.         // --------------------------------------------------------------------------
  3.         private function smokePuffss() : Sprite
  4.         {
  5.             var smokePuff: Sprite = new Sprite();
  6.             // Случайная позиция от -2 до +2
  7.             var randX: Number = -2 + Math.random() * 4;
  8.            
  9.             // Ветер
  10.             if (puffWind != null)
  11.             {
  12.                 switch (puffWind)
  13.                 {
  14.                     case 'right': // право
  15.                         randX += 3;
  16.                         break;
  17.                     case 'left': // лево
  18.                         randX -= 3;
  19.                         break;
  20.                 }
  21.             }
  22.            
  23.             // Рисуем
  24.             smokePuff.graphics.beginFill(color);
  25.             smokePuff.graphics.drawCircle(randX, 0, puffRadius);
  26.             smokePuff.graphics.endFill();
  27.             // Применяем фильтр размытия
  28.             smokePuff.filters = [puffBlur];
  29.            
  30.             smokePuff.addEventListener(Event.ENTER_FRAME, moveUp);
  31.            
  32.             return smokePuff;
  33.         }
  34.         // --------------------------------------------------------------------------
  35.  
Программист: PHP+MySQL, Java, AS, Мой skype: chinese.beemaster
Аватара пользователя
ChineseBeemaster

 
Автор темы
Сообщения: 64
Зарегистрирован: 28 авг 2011, 04:02
Откуда: Минск, Беларусь
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.

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

Сообщение Oxya » 19 ноя 2011, 20:51

подскажите как остановить этот дым? мне нужно чтобы он шел, пото переставал секунд на 10, а потом начинал идти снова. Заранее спасибо
Oxya

 
Сообщения: 2
Зарегистрирован: 19 ноя 2011, 20:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение 112 » 19 ноя 2011, 23:01


чтобы убрать дым подойдет?
Если ты дебил ,оставайся им!
Я бы изменил мир,но Бог не дает исходники!
Изображение
Аватара пользователя
112
Модератор
Модератор
 
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

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

Сообщение Oxya » 22 ноя 2011, 18:50

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

 
Сообщения: 2
Зарегистрирован: 19 ноя 2011, 20:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение POGROMIST » 18 ноя 2012, 01:39

Oxya
снизу вверх это отнимать координаты по "Y", а если наискось в правый угол то значит одновременно отнимать "Y" и прибавлять "X" ну это же элементарно!
В switch добавить
  1. case 'Btr': //
  2.       randX += 3;
  3. randY-=3;                       //чисто эту строчку
  4.         break;
POGROMIST

 
Сообщения: 1
Зарегистрирован: 18 ноя 2012, 01:03
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Guffi » 09 дек 2012, 23:13

Хочу предложить свой эффект реалистичного дыма flashyroki.ru/dim.html или эффект пара flashyroki.ru/hot_cup.html
Guffi

 
Сообщения: 1
Зарегистрирован: 09 дек 2012, 23:09
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение Alazaur » 10 дек 2012, 00:52

Guffi, у автора топика вариант на много лучше, чем оба вами показанные, хотя и у него есть что допилить. А вообще пора давно на AS3 переходить.То что сами не хотите переходить на более правильный стиль программирования дело ваше, но зачем людям давать такие вот вредные уроки... Это лично мое мнение и не претендует на правильное, но я против их появления на свет.
Alazaur
Разработчик
Разработчик
 
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25
Благодарил (а): 24 раз.
Поблагодарили: 121 раз.

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

Сообщение sanych_dv » 10 дек 2012, 01:46

Как это ни парадоксально, мне иногда приходится пилить баннеры/заставки/элементы интерфейса на сайты в AS2. Заказчики просят +HTML5 версию, а более-менее внятный конвертер Google Swiffy работает только с AS2.
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.


Вернуться в Уроки на другие темы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron