// ----------------------------------------------------------------------------
// МОДУЛИ
// ----------------------------------------------------------------------------
uses
GraphWPF;
// ----------------------------------------------------------------------------
// КОНСТАНТЫ
// ----------------------------------------------------------------------------
const
PN = 3; // количество слоёв
PK = 4; // плотность капель на слое
VX = -9; // скорость по горизонтали
VY = 70; // скорость по вертикали
// ----------------------------------------------------------------------------
// ПЕРЕМЕННЫЕ
// ----------------------------------------------------------------------------
var
planes : array [0..PN-1] of array of GPoint; // слои со звёздами
// ----------------------------------------------------------------------------
// Установки при старте программы (выполняется однократно)
// ----------------------------------------------------------------------------
procedure Setup();
begin
Window.Title := 'Дождь';
Window.Width := 854;
Window.Height := 480;
Window.IsFixedSize := true;
for var i := Low(planes) to High(planes) do begin
planes[i] := new GPoint[sqr((PN-i)*PK)];
for var j := Low(planes[i]) to High(planes[i]) do begin
var d := new GPoint(Random(0,Window.Width), Random(0,Window.Height));
planes[i][j] := d;
end;
end;
end;
// ----------------------------------------------------------------------------
// Подпрограмма выполняет все расчёты перед отрисовкой кадра
// ----------------------------------------------------------------------------
procedure Move();
begin
for var i := Low(planes) to High(planes) do begin
var vx := VX/(PN-i);
var vy := VY/(PN-i);
for var j := Low(planes[i]) to High(planes[i]) do begin
var x := planes[i][j].X + vx;
var y := planes[i][j].Y + vy;
if x < 0 then x := Window.Width;
if y < 0 then y := Window.Height;
if x > Window.Width then x := 0;
if y > Window.Height then y := 0;
planes[i][j] := new GPoint(x,y);
end;
end;
end;
// ----------------------------------------------------------------------------
// Подпрограмма отрисовки кадра
// ----------------------------------------------------------------------------
procedure Draw();
begin
FillRectangle(0,0, Window.Width, Window.Height, Colors.SlateGray);
for var i := Low(planes) to High(planes) do
for var j := Low(planes[i]) to High(planes[i]) do begin
var x1 := planes[i][j].X;
var y1 := planes[i][j].Y;
var x2 := x1 + VX/(PN-i)/2;
var y2 := y1 + VY/(PN-i)/2;
Line(x1,y1, x2,y2, Colors.Azure);
end;
end;
// ----------------------------------------------------------------------------
// Подпрограмма вызывающаяся перед показом каждого кадра на экране
// ----------------------------------------------------------------------------
procedure FrameLoop(frame : integer);
begin
Move();
Draw();
end;
// ----------------------------------------------------------------------------
// Точка входа в программу
// ----------------------------------------------------------------------------
begin
Setup();
BeginFrameBasedAnimation(FrameLoop, 30);
end.