Getlmage. Помещает в память копию...
h2>Рис.14.10. Иллюстрация процедур Getlmage/Putlmage
Uses Graph, CRT;
const
r = 20; {Характерный размер НЛО}
pause = 50; {Длительность паузы}
var
d,m,e,xm/ym,x,y/lx,ly,rx,ry,
Size,i,dx,dy,Width,Height: Integer;
Saucer : Pointer;
label
loop;
begin
{Инициируем графику}
d := Detect; lnitGraph(d, m, ' ') ;
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
x := r*5;
у := r*2;
xm := GetMaxX div 4;
ym := GetMaxY div 4;
{Создаем "тарелку" из двух эллипсов с усами антенн}
Ellipse (х,у,0,360,r,r div 3+2); ,
Ellipse (х,у-4,190,357,r,r div 3);
Line (х+7,у-б,х+10,у-12);
Line (x-7,y-6, х-10, у-12);
Circle (x+10,y-12,2);
Circle (х-10,у-12,2);
FloodFill(x+l,y+4,White);
{Определяем габариты НЛО и помещаем его в кучу}
1х := х-r-1;
1у := у-14;
гх := х+r+1;
гу := у+r div 3+3;
Width := rx - lx + 1;
Height:= ry - ly + 1;
Size := ImageSize(lx, ly, rx, ry);
GetMem (Saucer, Size);
Getlmage (lx, ly, rx, ry, Saucer^);
{Стираем построенное}
Putlmage (lx, ly, Saucer^, xorPut);
{Создаем звездное небо}
Rectangle(xm,ym,3 *xm,3 *ym);
SetViewPort(xm+1,ym+1,3*xm-1,3*ym-1,ClipOn);
xm := 2*xm;
ym := 2*ym;
for i:=1 to 200 do
PutPixe1 (Random(xm), Random(ym), White) ;
{Задаем начальное положение НЛО и направление движения}
х := xm div 2;
у := ym div 2;
dx := 10;
dy := 10;
{Основной цикл}
repeat
Putlmage(x,y,Saucer^,xorPut); {Изображаем НЛО на}
Delay(pause); {новом месте и после}
Putlmage (x, у, Saucer^, XorPut);{паузы стираем его}
{Получаем новые координаты}
loop: x := x+dx;
у := y+dy;
{НЛО достиг границы экрана?}
if (x<0) or (x+Width+1>xm) or
(у<0) or (y+Height+1>ym) then
begin {Да - НЛО достиг границы: меняем направление его перемещения}
x := x-dx;
y:= y-dy;
dx : = GetMaxX div 10 - Random(GetMaxX div 5);
dy := GetMaxY div 30 - Random(GetMaxY div 15);
goto loop
end
until KeyPressed;
if ReadKey=#0 then x := ord(ReadKey);
CloseGraph
end
end.