В программе реализован алгоритм анимации фейерверков на языке программирования Delphi. 1. переменная pos отвечает за начальное положение точек; 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.
Ключевые слова:
фейерверки, анимация
|
|||||||