-
-
{$mode objfpc}{$H+}
-
interface
-
uses
-
Classes, SysUtils, Forms, ExtCtrls,Graphics,GraphType;
-
Const N=250;//Количество снежинок
-
{Новый тип данных для хранения информации о снежинке}
-
type TSnezhinka=record
-
x,y : integer;//Координаты снежинки
-
X_Shift, Y_Shift : integer;//Сдвиг снежинки по осям OX и OY
-
Size : integer;//Размер снежинки
-
color : Tcolor;//Цвет снежинки
-
end;
-
type
-
{ TSnow }
-
TSnow=object {Тип данных для всех снежинок}
-
SnowBuf : TBitmap;//Буфер где храняться снежинки
-
gravity : integer;//Гравитация
-
Wind: integer;//Ветер
-
SnowMatrix : array [1..N] of TSnezhinka;//Массив со снежинками
-
procedure Init(Width, Height: integer; Color : TColor);//Инициализация
-
procedure Draw(canvas : TCanvas);//Отрисовка
-
end;
-
{ TTree }
-
TTree=object {Тип данных для дерева}
-
TreeBuf : TBitmap;//Буфер где храняться снежинки
-
procedure Init(filename: string);//Инициализация
-
procedure Draw(canvas : TCanvas);//Отрисовка дерева
-
end;
-
{ TTextOut }
-
TTextOut=object {Тип данных для текста}
-
TextBuf : TBitmap;//Буфер где храняться снежинки
-
R,G,B, Rs, Gs, Bs : integer;
-
procedure Init(canvas : TCanvas);//Инициализация
-
procedure Draw(canvas : TCanvas);//Отрисовка дерева
-
end;
-
implementation
-
{ TSnow }
-
{Инициализация объекта со снежинками}
-
procedure TSnow.Init(Width, Height: integer; Color: TColor);
-
var i : integer;
-
begin
-
Randomize;
-
gravity:=1;//Гравитация
-
Wind:=1;//Ветер
-
for i:=1 to N do begin//Цикл инициализации снежинок
-
SnowMatrix[i].X:=Random(Width);//Случайная координата по оси OX
-
SnowMatrix[i].Y:=Random(Height);//Случайная координата по оси OY
-
SnowMatrix[i].Color:=Color;//Цвет снежинки
-
SnowMatrix[i].Size:=Random(2)+1;//СЛучайный размер снежинки
-
SnowMatrix[i].X_Shift:=Random(2)-1;//Сдвиг по оси OX
-
SnowMatrix[i].Y_Shift:=1;//Сдвиг по оси OY
-
end;
-
//Создаем и задаем размеры буфера для снежинок
-
SnowBuf:=TBitmap.Create;
-
SnowBuf.Width:=Width;
-
SnowBuf.Height:=Height;
-
end;
-
{Отрисовка объекта со снежинками}
-
procedure TSnow.Draw(canvas : TCanvas);
-
var i : integer;
-
begin
-
Randomize;
-
//Цикл сдвига всех снежинок
-
for i:=1 to N do begin
-
SnowMatrix[i].X:=SnowMatrix[i].X+Wind;//Смещение по оси OX
-
SnowMatrix[i].Y:=SnowMatrix[i].Y+gravity;//Смещение по оси OY
-
canvas.Pen.Color:=clWhite;//Цвет снежинок
-
//снежинки в виде круга
-
{
-
canvas.Ellipse(
-
Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
-
);
-
Canvas.Brush.Color:=clWhite;//Цвет заливки
-
//Заливаем внутренности снежинки
-
canvas.FloodFill(Round(SnowMatrix[i].X),
-
Round(SnowMatrix[i].Y),
-
clWhite,
-
fsSurface
-
);
-
}
-
//Снежинки в виде звездочек
-
canvas.Pen.Color:=RGBToColor(Random(255),Random(255),Random(255));//Случайный цвет для снежинок
-
canvas.Line( Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
-
);
-
canvas.Line( Round(SnowMatrix[i].X),
-
Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].X),
-
Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
-
);
-
canvas.Line( Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y),
-
Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)
-
);
-
canvas.Line( Round(SnowMatrix[i].X)+SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].X)-SnowMatrix[i].Size,
-
Round(SnowMatrix[i].Y)+SnowMatrix[i].Size
-
);
-
//Анализ выхода снежинок за границы формы
-
if SnowMatrix[i].Y>canvas.Height then begin
-
SnowMatrix[i].y:=0;
-
SnowMatrix[i].Size:=Random(2)+1;
-
end;
-
if SnowMatrix[i].X>canvas.Width then begin
-
SnowMatrix[i].X:=0;
-
SnowMatrix[i].Size:=Random(2)+1;
-
end;
-
end;
-
end;
-
{ TTree }
-
{Инициализация объекта с деревом}
-
procedure TTree.Init(filename: string);
-
begin
-
TreeBuf:=TBitmap.Create;
-
TreeBuf.LoadFromFile(filename);
-
TreeBuf.Transparent:=true;
-
TreeBuf.TransparentColor:=TreeBuf.Canvas.Pixels[1,1];
-
end;
-
{Отрисовка дерева}
-
procedure TTree.Draw(canvas: TCanvas);
-
begin
-
canvas.Draw((canvas.Width div 2) - (TreeBuf.Width div 2),
-
(canvas.Height) - (TreeBuf.Height),
-
TreeBuf);
-
end;
-
{ TTextOut }
-
procedure TTextOut.Init(canvas : TCanvas);
-
begin
-
TextBuf:=TBitmap.Create;
-
TextBuf.Width:=50;
-
TextBuf.Height:=50;
-
TextBuf.TransparentColor:=clBlack;
-
TextBuf.Canvas.CopyRect(Rect(0,0,TextBuf.Width,TextBuf.Width),
-
canvas,
-
Rect(0,0,TextBuf.Width,TextBuf.Width)
-
);
-
// TextBuf.Transparent:=true;
-
R:=120;G:=120;B:=120;Rs:=Random(10);Gs:=Random(10);Bs:=Random(10);
-
end;
-
//------------------------------
-
procedure TTextOut.Draw(canvas: TCanvas);
-
var TDay1, TDay2, DateDiff: TDateTime;
-
begin
-
//Очистка фона (копируем кусок фона из буфера, очищая старый текст)
-
TextBuf.Canvas.CopyRect(Rect(0,0,TextBuf.Width,TextBuf.Width),
-
canvas,
-
Rect(0,0,TextBuf.Width,TextBuf.Width)
-
);
-
//Определяем количество дней до НГ
-
TDay1 := Date;
-
TDay2 := StrToDate('31.12.'+IntToSTr(CurrentYear));//Для Windows
-
// TDay2 := StrToDate('31-12-'+IntToSTr(CurrentYear));//Для Linux
-
DateDiff := TDay2 - TDay1+1;
-
r:=r+Rs; if (r>=245) or (r<=120) then Rs:=-Rs; //Изменение красной состовляющей цвета надписи
-
g:=g+Gs; if (g>=245) or (g<=120) then Gs:=-Gs;//Изменение зеленой состовляющей цвета надписи
-
// b:=b+Gs; if (b>=245) or (b<=120) then bs:=-bs;//Изменение синей состовляющей цвета надписи
-
TextBuf.Canvas.Font.Size:=24;
-
TextBuf.Canvas.Font.Color:=RGBToColor(r,g,b);
-
TextBuf.Canvas.TextOut(0,0,leftstr(DateToStr(DateDiff),2));
-
canvas.Draw(0,0,TextBuf);
-
end;
-
end.