Стирает часть экрана и на это место помещает копию
XorPut
Исключительное или
Рисует сохраненный образ или стирает ранее нарисованный, сохраняя фон
OrPut
Объединительное или
Накладывает сохраненный образ на существующий
AndPut
Логическое и
Объединяет сохраненный образ и уже существующий на экране
NotPut
Инверсия изображения
То же самое, что и 0, только копия выводится в инверсном виде
Упражнение 2. Изучить программу, которая рисует звездное небо и перемещает на его фоне рисунок НЛО. Проверить действие программы.
program NLO;
uses crt, graph;
const k=20;
Pause=50;
var d, m, xmin, xm, ymin, ym, x, y, tx, ty, rx, ry, size, i, dx, dy, width, height: integer;
sauser:Pointer;
begin
Randomize;
d:= detect;
initgraph (d, m, ‘путь к драйверу’);
SetTextStyle (0, 0, 2);
OutTextXY (50, 10, ‘Демонстрация движения НЛО’); {Рисуем НЛО}
x:=R*5; y:=R*2; xm:=GetmaxX-5; ym:=GetmaxY-25; Ellipse(x, y, 0, 360, R, R div 3+2); Ellipse(x, y-4, 190, 357, R, R div 3); Line(x + 7, y - 6, x + 10, y - 12); Line(x - 7, y - 6, x + 10, y - 12); Circle(x + 10, y - 10, 2); Circle(x - 10, y - 10, 2); FloodFill(x+1, y+4, White); {определяем габариты НЛО и помещаем в специальную динамическую переменную} Tx:= x-R; Ty:=y-14; Rx:=x+R; Ry:=y+R div3 +3; Width:=Rx-Tx+1; Size:=ImageSize(Tx, Ty, Rx, Ry);
GetMem(sauser, Size); GetImage(Tx, Ty, Rx, Ry, sauser^); {стираем построенное изображение} PutImage(Tx, Ty, sauser^, XorPut); {рисуем звездное небо} SetStyle (1, blue); {установить стиль и цвет закраски голубое небо} SetColor (White); {начертить прямоугольник и открыть окно} Rectangle (xmin, ymin, GetmaxX, GetmaxY); SetViewPort (xmin, ymin, GetmaxX, GetmaxY, ClipOn); FloodFill (xmin+1, ymin+1, White); For i:=1 to 500 do {нарисовать 500 звезд белого цвета} PutPixel(Random(GetmaxX), Random(GetmaxY- ymin), 15); {задаем начальное положение НЛО} x:=xm div 3 – xmin; y:=ym div 3 – ymin; dx:=6; dy:=6; Repeat {цикл: повторять, пока не нажата любая клавиша} PutImage (x, y, sauser^, XorPut); {изображаем объект} Delay (Pause);{задержка} PutImage(x, y, sauser^, XorPut); {после паузы стираем объект} {перемещаем объект} If (x<xmin) Or (y<ymin) Or (x+Width +1> xm) Or (y+Height +1> ym) Then begin {если объект смещается влево-вверх за границы окна, изменить координаты так, чтобы он оставался в окне} If (x- Dx< xmin) then x:= xmin else x := x- Dx; If (y- Dy< ymin) then y:= ymin else y := y- Dy; Dx:= GetmaxX div 10 - Random(GetmaxX div 4); Dy:= GetmaxY div 10 - Random(GetmaxY div 4); end else begin {если объект смещается вправо-вниз за границы окна, изменить координаты так, чтобы он оставался в окне} If (x + Dx< xm) then x:= x + Dx else x:= Random(GetmaxX) - Random(GetmaxX div 4); If (y + Dy< ym) then y:= y + Dy else y:= Random(GetmaxY) - Random(GetmaxY div 3); end; until KeyPressed; {завершить, как только будет нажата клавиша} FreeMem (sauser, Size); Closegraph; end; end.
Задание: В любую из этих программ добавить свой «движущийся» объект