Вид окна программы приведен на рис. 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.