Работа с графикой

Организация движения объектов на графическом экране


Организовать движение объектов по графическому экрану можно четырьмя способами:

  1. «рисую – стираю»
  2. с помощью клавиш
  3. с использованием динамической памяти
  4. с использованием экранных страниц

Рассмотрим два первых способа. Наиболее просто организовать перемещение фрагмента рисунка на экране можно по следующему плану:

Пример 1. Организовать движение окружности по периметру прямоугольной области.

program boll;
uses graph,crt;
var gd,gm,x,y,rx,ry,dx,dy,rad,x1,y1:integer;
begin
gd:=detect; initgraph(gd,gm,' ');

{радиус окружности должен быть кратен шагу смещения}
x:=100;y:=100; rx:=300; ry:=300; dx:=2;dy:=0; rad:=4;
setlinestyle(0,0,3);
rectangle(x,y,x+rx,y+ry);

x1:=x+rad; y1:=y+rad;
setlinestyle(0,0,1);

repeat
{рисуем окружность желтым цветом}
setcolor(14);
circle(x1,y1,rad); delay(500);

{стираем – рисуем черным цветом}
setcolor(0);
circle(x1,y1,rad);

{определяем новые координаты центра окружности}
x1:=x1+dx; y1:=y1+dy;

{определяем направление движения}
if (x1+rad=x+rx) and (y1=y+rad) then begin dx:=0; dy:=2; end;
if (x1+rad=x+rx) and (y1=y+ry-rad) then begin dx:=-2; dy:=0; end;
if(x1=x+rad) and (y1=y+ry-rad) then begin dx:=0; dy:=-2; end;
if(x1=x+rad) and (y1=y+rad) then begin dx:=2; dy:=0; end;
until keypressed;

closegraph;
end.

Используя коды клавиш, можно организовать движение объектов на экране по восьми направлениям. Вообще то, можно использовать любые клавиши, но возьмем более подходящие: #71 (Home), #73 (Page Up), #81(Page Down), #79 (End), #72 ( ), #80 ( ), #75 (), #77(). Коды указанных клавиш являются расширенными, т.е. занимают два байта памяти (в старшем хранится код 0), поэтому процедура чтения кода клавиши readkey применяется два раза, если код первого байта равен 0. выход из программы можно организовать с помощью клавиши Esc (код #27).

Пример 2. Организовать движение окружности в прямоугольной области

program boll2;
uses graph,crt;
var gd,gm,x,y,rx,ry, rad,x1,y1,step:integer; ch:char;
begin
gd:=detect; initgraph(gd,gm,' ');
x:=100;y:=100; rx:=300; ry:=300; step:=2; rad:=20;{radius kraten shagu}
setlinestyle(0,0,3);
rectangle(x,y,x+rx,y+ry);
x1:=x+rad; y1:=y+rad;
setlinestyle(0,0,1);

repeat
{рисуем окружность желтым цветом}
setcolor(14);
circle(x1,y1,rad);

{Определяем код нажатой клавиши}
ch:=readkey;
if ch=#0 then ch:=readkey;

{стираем – рисуем черным цветом}
setcolor(0);
circle(x1,y1,rad);

{смещаем центр окружности}
case ch of
#75: x1:=x1-step;
#77: x1:=x1+step;
#72: y1:=y1-step;
#80: y1:=y1+step;
#71: begin x1:=x1-step; y1:=y1-step; end;
#73: begin x1:=x1+step; y1:=y1-step; end;
#79: begin x1:=x1-step; y1:=y1+step; end;
#81: begin x1:=x1+step; y1:=y1+step; end;
end;

{определяем границы прямоугольной области, за которые «выходить» нельзя}
if (x1+rad>=x+rx) then x1:=x+rx-rad;
if (x1-rad<=x) then x1:=x+rad;
if (y1+rad>=y+ry) then y1:=y+ry-rad;
if (y1-rad<=y) then y1:=y+rad;
until ch=#27;

closegraph;
end.



Назад

Далее