Фейерверки

 имени-1.jpg

В программе реализован алгоритм анимации фейерверков на языке программирования Delphi.

1. переменная pos отвечает за начальное положение точек;
2. Уравнениями
Fx(t)=(ax*tt+bx*t)/cx
Fy(t)=xs+dx*t/maxt
задается местоположение точек перед "взрывом";
3. функция ModeMove отвечает за движение точек;
4. в переменных feu[i].pos.x и feu[i].pos.y хранятся координаты положения;
5. в переменных feu[i].explosion[j] указывается момент взрыва
6. в функции ModeExplode задаеются параметры "разброса" искр;
7. происходит процедура прорисовки на экране полученного результата.

unit UMain;
 
interface
// подключаем библиотеки
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
// создание класса формы
type
  TForm1 = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
 
 
  private
 
  public
 
  end;
 
const
 MaxT=256; // максимальное время появления новой вспышки
 TailleLettre=40;
 // палитра цветов
 TableCouleur:array[0..6] of integer=
 ($000001,$000100,$010000,
  $000101,$010100,$010001,
  $010101);
// константы, определяющие состояние
 ModeStandby=0; // паузы
 ModeWait=1; // ожидания
 ModeMove=2; // движение
 ModeExplode=3; // взрыв
 
 
 
// класс (тип) "взрыв"
type
 TExplosion=record vx,vy,px,py,cl:integer; end;
 
 TFeu=record temps:integer;
             mode:byte;
             color:integer;
             pos:tpoint;        // текущее положение
                                // Параметрическое уравнение положения
             ax,bx,cx:integer;  // Fx(t)=(ax*tt+bx*t)/cx
             xs,dx:integer;     // Fy(t)=xs+dx*t/maxt
             explosion:array[0..50] of TExplosion; // создание массива объектов "взрыв"
      end;
 
 
var
  Form1: TForm1;
  feu:array[1..300] of TFeu; // создаем массив объектов "искра"
 
implementation
 
{$R *.dfm}
// процедура создания искр
procedure NouveauFeu(var Feu:tfeu);   // новая искра
var
 b,t,tt:integer;
begin
 feu.temps:=MaxT-random(5*MaxT);  // количество искр (генерируется случайно)
 if feu.temps>=0 then feu.mode:=ModeMove // если хоть одна искра есть, перемещаемся по форме
                 else feu.mode:=ModeWait; // иначе ожидание
 feu.mode:=ModeMove; //  перемещаемся по форме
 // генерируем параметры для уравнения параметрического задания координат
 t:=MaxT;
 tt:=random(screen.Height-200)+200;
 b:=2*(t+random(t div 2)-t div 4);
 // задание значений свойств
 feu.ax:=tt;
 feu.bx:=-tt*b;
 feu.cx:=t*(t-b);
 feu.xs:=random(screen.Width);
 feu.dx:=random(screen.Width)-feu.xs;
 feu.color:=TableCouleur[random(6)]; // выбираем цвет (случайно)
end;
 
procedure TForm1.FormCreate(Sender: TObject); // создание формы
var
 i,b,t,tt:integer;
begin
 randomize; // включаем генератор случ. чисел
 
 //затухание огней
 for i:=111 to 300 do nouveaufeu(feu[i]); // задаем яркость огней
end;
 
procedure TForm1.TimerTimer(Sender: TObject); // события, происходящие по таймеру
var
 i,t,j,angle,veloc:integer;
begin
 for i:=1 to 300 do
  case feu[i].mode of // выбор действия
   ModeStandby:;
 
 
   ModeMove:  // перемещаемся по форме
    begin
     inc(feu[i].temps);
     t:=feu[i].temps;
     // Новое положение феерверка
     feu[i].pos.x:=feu[i].xs+feu[i].dx*t div MaxT;
     feu[i].pos.y:=(feu[i].ax*t*t + feu[i].bx*t) div feu[i].cx;
     // Если время пришло, взрыв
     if feu[i].temps=MaxT then
      begin
       // создание искр
       for j:=0 to 50 do
        begin
         angle:=random(360); // вычисляем угол
         veloc:=random(64);
         feu[i].explosion[j].vx:=round(cos(angle*pi/180)*veloc);
         feu[i].explosion[j].vy:=round(sin(angle*pi/180)*veloc);
         feu[i].explosion[j].px:=feu[i].pos.x*32;
         feu[i].explosion[j].py:=feu[i].pos.y*32;
        end;
       feu[i].mode:=ModeExplode;
       feu[i].temps:=255; // количество искр
      end;
    end;
 
   ModeExplode:   // падение искр
    begin
     dec(feu[i].temps,2); // уменьшаем количество искр вдвое
     if feu[i].temps<0 then nouveaufeu(feu[i]) // если искр нет, создаем новую
     else
      begin
       for j:=0 to 50 do
        begin
         dec(feu[i].explosion[j].cl);
         dec(feu[i].explosion[j].vy);
         feu[i].explosion[j].px:=feu[i].explosion[j].px+feu[i].explosion[j].vx;
         feu[i].explosion[j].py:=feu[i].explosion[j].py+feu[i].explosion[j].vy;
         feu[i].explosion[j].cl:=feu[i].color*feu[i].temps;
        end;
      end;
   end;
  end;// конец случае;
 
 
 //ИНДИКАЦИЯ ВЫСВЕЧИВАНИЕ РИСОВАНИЕ ОБЪЕКТА (ИСКР и ВЗРЫВОВ)
 canvas.FillRect(clientrect); // задаем заливку
 for i:=1 to 300 do
  case feu[i].mode of
   ModeStandby,ModeWait:;// Рисуем искры
   ModeMove: canvas.Pixels[feu[i].pos.x,clientheight-feu[i].pos.y]:=feu[i].color*255;
   ModeExplode:  // рисуем взрывы
    for j:=0 to 50 do
      canvas.Pixels[feu[i].explosion[j].px div 32,clientheight-feu[i].explosion[j].py div 32]:=feu[i].explosion[j].cl;
      // Pixel - функция рисования пикселя
  end;
end;
 
end.

Ключевые слова: 
фейерверки, анимация
ВложениеРазмер
feerverk.rar163.36 кб