Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание на Дельфи.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

33. Напишите программу, по поверхности окна которой перемещается графический объект, например кораблик (рис. 1.30). Вид окна программы приведен на рис. 1.31.

Рис. 1.30. Кораблик

Рис. 1.31. Простая мультипликация — кораблик, плывущий по морю

unit ship_;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForml = class(TForm) Timerl: TTimer; procedure TimerlTimer(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations ) public I Public declarations } end;var Forml: TForml;implementation{$R *.DFM} x,y: integer; // координаты корабля (базовой точки)// вычерчивает на поверхности формы кораблик // или стирает его procedure Parohod(x,y: integer; mode: boolean); // x,y — координаты базовой точки кораблика // mode: True — нарисовать, False — стереть const / Базовые точки кораблика находятся в узлах сетки, шаг которой определяет размер кораблика ) dx = 5; // шаг сетки по X dy = 5; // шаг сетки по У var // корпус и надстройку будем рисовать // при помощи метода Polygon pi: array[1..7]of TPoint; // координаты точек корпуса р2: array[1..8]of TPoint; // координаты точек надстройки pc,bc: TColor; // текущей цвет карандаша и кистиbegin if not mode then begin // стереть Forml.Canvas.Brush.Color := clNavy; Forml.Canvas.Pen.Color : = ClNavy; Forml.Canvas.Rectangle(x,y+l,x+17*dx,y-10*dy); Forml.Canvas.Brush.Color := clNavy; // небо if y-10*dy < 80 then begin // конец мачты на фоне неба Forml.Canvas.Pen.Color := clSkyBlue; Forml.Canvas.Brush.Color := ClSkyBlue; Forml.Canvas.Rectangle(x,y-10*dy,x+17*dx,80); end; exit; end; // рисуем with Forml.Canvas do begin pc := Pen.Color; // сохраним текущий цвет карандаша be := Brush.Color; // и кисти Pen.Color := clBlack; // установим нужный цвет Brush.Color := clWhite; // рисуем . . . // корпус pl[i]-х = х; Pl [1] -У = y;  pl[2] .х = х; Pl [2].Y = y-2 *dy, pi[3].х =x+10*dx; Pl [3] .Y - y-2 *dy, pl[4] .X =x+ll*dx; pl [4].Y = y-3 +dy, pl[5] .X =x+17*dx; pl [5].Y = y-3 *dy, р1[б] .X =x+14*dx; Pl [6] .Y = y;  pl[7].X =x; Pl [7].Y ¦ У''  Polygon(pl); // надстройка p2[l].X := x+3*dx; p2[l].Y := y-2*dy; p2[2].X := x+4*dx; p2[2].Y := y-3*dy; р2[3].Х = x+4*dx; p2[3].Y = y-4*dy; р2[4] .X = x+13*dx; p2[4].Y = y-4*dy; р2[5].Х = x+13*dx; p2[5].Y = y-3*dy; р2[6].Х = x+ll*dx; p2[6].Y = y-3*dy; р2[7].Х = x+10*dx; p2[7].Y = y-2*dy; р2[8].Х = x+3*dx; p2[8].Y = y-2*dy; Polygon(p2); MoveTo(x+5*dx,y-3*dy) ; LineTo(x+9*dx,y-3*dy); // капитанский мостик Rectangle(x+8*dx,y-4*dy,x+ll*dx,y-5*dy); // труба Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy) ; // иллюминаторы Ellipse(x+ll*dx,y-2*dy,x+12*dx,y-l*dy) ; Ellipse(x+13*dx,y-2*dy,x+14*dx,y-l*dy); // мачта MoveTo(x+10*dx,y-5*dy); LineTo(x+10*dx,y-10*dy); // оснастка • Pen.Color := clwhite; MoveTo(x+17*dx,y-3*dy); LineTo(x+10*dx,y-10*dy) ; LineTo(x,y-2*dy) ; Pen.Color := pc; // восстановим старый цвет карандаша end; end;// обработка сигнала таймера procedure TForml.TimerlTimer(Sender: TObject); begin Parohod(x,y, False); // стереть рисунок if x < Forml.ClientWidth then x := x+2 else begin // новый рейс x := 0; у :- Random(50) + 100; end; Parohod(x,y,True); // нарисовать в новой точке end; procedure TForml.FormPaint(Sender: TObject); begin // небо Canvas.Brush.Color := clSkyBlue; Canvas.Pen.Color := clSkyBlue; Canvas.Rectangle(0,0,ClientWidth, 80) ; end;procedure TForml.FormCreate(Sender: TObj ect); begin x:=0; y:=80; // исходное положение парохода Forml.Color:=clNavy; // цвет моря Timerl.Interval := 50; // сигнал таймера каждые 50 мсек end;end.