· ··--──══[ COOLer issue #1 ]══─---·· ·
ЭФФЕКТ: ОГОНЬ by GELTORN/STORM




                 -=========ЭФФЕКТ: ОГОНЬ=========-


  В  сущности,  Flame,  это  тот  же Blur, изменений совсем немного.
Допустим, мы  хотим  изобразить  самый  простой вариант flame: Пламя
поднимается   с  низа  экрана  и  постепенно  гаснет.  Наша  формула
true-blur`а изменится совсем чуть-чуть:

...
    buffer[x][y+1]=(screen[x-1][y+1]+screen[x-1][y]+
                    screen[x-1][y-1]+screen[x][y+1]+
                    screen[x][y-1]+screen[x+1][y+1]+
                    screen[x+1][y]+screen[x+1][y-1])/8;
...

Уяснили? Для того, чтобы пламя красиво гасло, установим палитру так:

Номер цвета:   0         64        128       192      255
Цвет:        черный -> красный -> желтый -> белый -> белый

Пример:

...
  for(short k=0;k<=63;k++)
  {
    setrgbpalette(k,k,0,0);
    setrgbpalette(k+64,63,k,0);
    setrgbpalette(k+128,63,63,k);
    setrgbpalette(k+192,63,63,63);
  }
...

  Если  вам  кажется,  что пламя слишком медленно гаснет, то формулу
можно переписать вот так:

...
    short color=(screen[x-1][y+1]+screen[x-1][y]+
                 screen[x-1][y-1]+screen[x][y+1]+
                 screen[x][y-1]+screen[x+1][y+1]+
                 screen[x+1][y]+screen[x+1][y-1])/8;
    if(color>number) color-=number; else color=0;
    buffer[x][y+1]=color;
...

  Значение  number  выберите  по  своему  вкусу, чем оно больше, тем
быстрее будет гануть пламя.

  Да,  и  самое  главное,  чтобы  пламя "горело", его надо постоянно
"подпитывать":  в  самую  нижнюю  строчку  в  начале  каждого  кадра
записывать пиксели со случайным цветом.

Добавится вот такая строка:

...
  for(x=0;x<320;x+=4)
  {
    char color=rand()%256;
    screen[x][199]=c;
    screen[x+1][199]=c;
    screen[x+2][199]=c;
    screen[x+3][199]=c;
  }
...

  Забивая  сразу  четыре пикселя случайным цветом, мы получаем более
красивое  пламя.  Естественно,  эту  и несколько следующих строк  на
экран мы не выводим. Почему? Догадайтесь сами!

  Опять   же,  для  ускорения  можно  использовать  вариант  блюра с
четырьмя усредняемыми пикселями, немного его изменив:

...
  screen[x][y]=(screen[x-1][y-1]+screen[x][y-1]+
                screen[x][y-1]+screen[x+1][y-2])/4;
...

Вот еще одна быстрая формула:

...
for(short y=0;y<197;y+=2)
  for(short x=1;x<319;x++)
  {
    short high=screen[x-1][y-2]+screen[x][y-2]+screen[x+1][y-2];
    char low=screen[x][y-4];
    char pixel=(high+low)/4;
    screen[x][y]=pixel;
    screen[x][y-1]=(pixel+low)/2
  }
...
                                                  ---(Geltorn/Storm)


