Нарисовать дождь — Pascal ABC (Паскаль)

// ----------------------------------------------------------------------------
// МОДУЛИ
// ----------------------------------------------------------------------------
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.

Leave a Comment

63 + = 70