Составить графический алгоритм по коду:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Image1: TImage;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
cnt, oblakopos: integer;
raina: array [0..9] of integer; // Массив дляд ождя
procedure DrawSky(Canvas: TCanvas; Width, Height, X, Y: integer);
procedure DrawRain(Canvas: TCanvas; Width, Height, W, H, X, Y: integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DrawSky(Canvas: TCanvas; Width, Height, X, Y: integer);
begin
// Рисуем небо
Canvas.Brush.Color := rgb( 0, 224, 255); //clBlue;
Canvas.Rectangle(0, 0, Width, Height*3 Div 5);
//Рисуем землю
Canvas.Brush.Color := clGreen;
Canvas.Rectangle(0, Height*3 Div 5, Width, Height);
//Рисуемо блако
Canvas.pen.Color := clWhite;
Canvas.brush.Color := clWhite;
Canvas.ellipse(X , Y-15, X+50, Y+15);
Canvas.ellipse(X-25, Y-35, X+25, Y+ 5);
Canvas.ellipse(X-50, Y-25, X, Y+ 5);
end;
procedure TForm1.DrawRain(Canvas: TCanvas; Width, Height, W, H, X, Y: integer);
var
i: integer;
begin
for i := Low(raina) to High(raina) do begin
if raina[i] > 0 then begin // Если больше 0 то рисуем каплю дождя
// В массиве содержится текущая высота падающей капли. Она смещается на X и Y
Canvas.MoveTo(X + i*W, Y + H - raina[i]);
Canvas.LineTo(X + i*W, Y + H - raina[i] + 20);
raina[i] := raina[i] - 5;
end else begin // Если 0, то случайным образом присваиваем высоту
if Random(1000) < 100 then
raina[i] := H;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (cnt < 300) or (cnt > 600) then
oblakopos := oblakopos + 1;
DrawSky(Image1.Canvas, Image1.Width , Image1.Height, oblakopos, 100);
if (cnt > 300) and (cnt < 600) then
DrawRain(Image1.Canvas, Image1.Width , Image1.Height, 10, 200, oblakopos-50, 100);
cnt := cnt + 1;
if cnt > 950 then //Timer1.Enabled := false;
begin
cnt := 0;
oblakopos := cnt; // Либо повтор цикла
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
cnt := 0;
oblakopos := cnt;
timer1.Interval := 20;
Image1.Width := 660;
Image1.Height := 500;
Image1.Picture.Bitmap.Width := 640;
Image1.Picture.Bitmap.Height := 480;
ClientWidth := 660;
ClientHeight := 500;
FillChar(raina, SizeOf(integer)*(High(raina)-Low(raina)+1), 0);
Form1.DoubleBuffered := true;
end;
end.

23 Окт 2019 в 20:00
294 +1
0
Ответы
1
НачалоИнициализация переменных и таймераСоздание формы и изображенияУстановка размеров изображенияЗаполнение массива rainaУстановка DoubleBuffered для сглаживания изображенияНачало цикла Timer1TimerПроверка условия для движения облакаРисование неба и землиРисование облакаПроверка условия для отображения дождяРисование дождяУвеличение счетчикаПроверка условия завершения циклаСброс счетчика и позиции облакаКонец цикла Timer1TimerКонец.
19 Апр 2024 в 09:48
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир