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

Примеры Пример 8.7. Программа рисует человечка, делающего утреннюю зарядку.

 

Program Animation; 

  Uses Crt, Graph; 

{подключение к программе библиотек Crt и Graph} 

  Const {вертикальные и горизонтальные координаты положения рук} 

  Vert : Array[1..3] of Integer = (190, 157, 120); 

  Horizont : Array[1..3] of Integer = (200, 190, 200); 

  Var 

  GrDriver, GrMode, GrError, i, j : Integer; 

BEGIN 

  GrDriver := Detect; InitGraph(GrDriver, GrMode, 'C:\TP\BGI'); 

  GrError := GraphResult; If GrError <> GrOk then Halt; 

  SetColor(LightGray); { установка светлосерого цвета для рамки} 

  Rectangle(20, 20, 480, 400); {рисование рамки} 

  SetColor(LightCyan); {установка яркоголубого цвета для текста} 

  OutTextXY(200, 40, 'П Р И В Е Т !'); 

  SetColor(LightGray); Circle (250, 130, 20); {голова} 

  SetColor(Yellow); Arc(250, 130, 0, 180, 26); {волосы} 

  Arc(250, 130, 0, 180, 24); Arc(250, 130, 0, 180, 22); 

  Line(250, 105, 244, 115); Line(250, 105, 250, 116); {чубчик} 

  Line(250, 105, 256, 115); 

  SetColor(LightCyan); Circle(241, 125, 4); {левый глаз } 

  Circle(259, 125, 4); {правый глаз} 

  SetColor(LightRed); 

  SetFillStyle(SolidFill, LightRed); 

  FillEllipse(250, 140, 6, 3); {рот } 

  Setcolor(Green); 

  Line(250, 152, 250, 220); {туловище } 

  Line(250, 220, 210, 290); {левая нога } 

  Line(250, 220, 290, 290); {правая нога} 

  Repeat {цикл прерывается нажатием любой клавиши} 

  For i := 1 to 3 do {Последовательный вывод трех положений рук:} 

  begin { вниз, на уровне плеч, вверх } 

  SetColor(LightCyan); Sound(200*i); 

  Line(250, 157, Horizont[i], Vert[i]); {левая рука} 

  Line(250, 157, 500-Horizont[i], Vert[i]); {правая рука} 

  Delay(300); {задержка} 

  SetColor(Black); {смена цвета на черный для повторного 

  pисования рук в том же положении 

  ("стирания" их с экрана) } 

  Line(250, 157, Horizont[i], Vert[i]); {левая рука } 

  Line(250, 157, 500-Horizont[i], Vert[i]); {правая рука} 

  end 

  until Keypressed; 

  SetColor(LightCyan); 

  Line(250, 157, Horizont[3], Vert[3]); {левая рука поднята } 

  Line(250, 157, 500-Horizont[3], Vert[3]); {правая рука поднята} 

  For i := 1 to 10 do { звуковая трель } 

  begin 

  Sound(1000); 

  Delay(50); 

  Sound(1500); 

  Delay(50) 

  end; 

  NoSound; { выключение звука } 

  CloseGraph;

END.

Пример 8.10. Программа изображает планету, вращающуюся вокруг Солнца на фоне мерцающих звезд и расходящейся галактики.

П еремещение и изменение размеров изображений на экране можно организовать по разному. Так, в примере 8.6 эффект движения изображения достигается следующим образом: выводится изображение, затем оно стирается с экрана с помощью процедуры ClearViewPort, повторно выводится с некоторым перемещением и т.д.

В примере 8.7 применяется другой способ. Сначала на экран выводится рисунок, затем тот же рисунок повторно изображается цветом фона, отчего он становится невидимым, далее рисунок выводится в исходном цвете, но с некоторым перемещением и т.д.

Оба способа имеют одинаковый недостаток —  движение изображения является прерывистым и вызывает мелькание экрана.

В этой программе для организации более плавного движения изображения по экрану используется возможность формировать изображение на разных страницах видеопамяти (обычно их две или четыре, в зависимости от типа графического адаптера).

Изображение сначала создается на странице с нулевым номером, видимой по умолчанию, а на невидимой странице с номером 1 формируется изображение с небольшим перемещением. Затем страница с номером 1 делается видимой, а новое изображение формируется на ставшей невидимой странице с нулевым номером и т.д.