Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PASСAL_a4_2007.doc
Скачиваний:
31
Добавлен:
13.09.2019
Размер:
2.51 Mб
Скачать

Лабораторная работа 15. Как делается движущееся изображение

Задание 1

Скопируйте в Ваш каталог файлы images_1.pas, images_2.pas. Запустите среду Turbo Pascal.

Задание 2

Загрузите программу, хранящуюся в файле images_1.pas. Разберитесь внимательно в тексте программы. Затем:

а) измените программу таким образом, чтобы нарисованный светофор выводился еще в точки с координатами (400,300), (350,100) и (600,10);

б) модифицируйте программу так, чтобы она выводила 10 картинок в ряд.

Задание 3

Загрузите программу, хранящуюся в файле images_2.pas .

Программа демонстрирует организацию движения светофора по экрану. Разберитесь, как она работает. Модифицируйте программу таким образом, чтобы:

а) картинка двигалась по окружности;

б) картинка передвигалась по периметру.

Задание 4

И наконец, обратите внимание на последний параметр функции putimage. Этот параметр используется для различных способов вывода картинки. Как было отмечено ранее, он может принимать следующие значения:

Normalput

=

0

замена существующего изображения на копию;

XORput

=

1

исключающее “ИЛИ”. Повторный вывод изображения на то же место сотрет эту часть экрана. Если операцию применить дважды к одному и тому же месту экрана, то вид изображения на экране не изменится;

OrPut

=

2

режим вывода картинки “ИЛИ”;

AndPut

=

3

режим вывода “И”;

NotPut

=

4

меняет цвета выводимой картинки на “противопо­лож­ные” (инверсное изображение).

Нарисуйте на экране закрашенный прямоугольник (закраска должна быть не сплошная). Попробуйте вывести какую-нибудь картинку (можно и светофор), используя все параметры. Определите ситуации, когда какой параметр следует использовать.

Задание 5

Составьте мультфильм из серии “Космос” (движущиеся планеты солнечной системы; летающая тарелка и т.п. - по Вашему усмотрению).

Теоретическая работа д. Использование страниц памяти для организации движения объектов по экрану

Научившись работать со сложной картинкой как с любым единичным объектом (точкой, линией, прямоугольником и т.п.), Вы можете уже в принципе писать программы с движущимся (динамическими) изображениями. К сожалению, тут есть один нюанс: если изображения достаточно велики (больше, чем 10x10 точек), при движении они “мигают”. Как сделать, чтобы мигание убрать? Для этого используют экраны.

При создании мультфильмов поступают следующим образом: рисуют отдельные картинки, которые потом по очереди снимают на пленку. Затем показывают эту пленку с частотой 24 кадра в секунду и получают движение.

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

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

InitGraph(Driver : integer; var Mode : integer; St : string);

где Driver - тип дисплея,

Mode - режим его работы,

St - путь к специальным подпрограммам, обеспечивающим работу с дисплеем. Такие подпрограммы имеют расширение .bgi и хранятся, как правило, в каталоге BGI.

В библиотеке Graph имеется набор констант, которые используются для указания типа дисплея (параметр Driver):

Detect

=

0

- автоматическое определение типа дис­плея;

CGA

=

1

- цветной, 320х200 точек;

MCGA

=

2

- монохромный, 640х200 точек;

EGA

=

3

- EGA, 256kb, цветной, 640х350 точек;

EGA64

=

4

- EGA, 64kb, цветной, 640х350 точек;

EGAMono

=

5

- EGA, 256kb, монохромный, 640х350

IBM8514

=

6

- SVGA, цветной, 1024x768

HercMono

=

7

- Herculess 720x348 точек, монохромный;

ATT400

=

8

- монитор ATT400

VGA

=

9

- VGA, 640x480 точек, 16 цветов или 320х200 точек и 256 цветов;

PC3270

=

10

- монитор PC3270

Кроме того, в библиотеке Graph содержатся константы, используемые для указания графического режима работы дисплея (параметр Mode). В частности:

Для EGA:

EGALo = 0; - 640x200 точек, 16 цветов, 4 страницы;

EGAHi = 1; - 640x350 точек, 16 цветов, 2 страницы;

Для VGA:

VGALo = 0; - 640x200 точек, 16 цветов, 4 страницы;

VGAMed = 1; - 640x350 точек, 16 цветов, 2 страницы;

VGAHi = 2; - 640x480 точек, 16 цветов, 1 страница.

Процедура InitGraph запускает программу-драйвер, обеспечивающую работу с указанным типом монитора. Такая программа хранится в файле с именем EGAVGA.BGI (обычно этот файл находится в каталоге BGI). Для проверки того, запущен ли драйвер и может ли он работать с данным монитором, используется следующий фрагмент программы:

...

InitGraph(Drive,Mode,’e:\tp70\bgi’);

If GraphResult<>GrOk then

{если программа управления монитором не найдена}

begin

WriteLn(‘у Вас проблемы с подключением графики’);

Halt(1) {стандартная процедура аварийного выхода из программы}

end;

...

Здесь GraphResult - функция, значение которой равно 0, если драйвер запущен и отличен от 0 в ином случае. GrOk - константа, значение которой равно 0.

Понятно, что мультипликацию можно реализовать только в режимах, при которых имеется не менее двух страниц. К сожалению, на компьютерах стандартной конфигурации две экранные страницы доступны только при работе дисплея в режиме EGA. VGA и SVGA - дисплеи обычно позволяют работать только с одной страницей. Именно поэтому, если Вы захотите использовать страницы, Вам нужно будет включать графический режим EGA.

Страницы нумеруются от 0. Если в режиме можно использовать две страницы, то их номера - 0 и 1. Если Вы нарисуете на нулевой странице одну картинку, на первой - другую, то имеется возможность практически мгновенно сменить изображения на экране. Как это сделать практически? Используются следующие процедуры:

SetVisualPage(Page : word); - устанавливает видимой страницу с номером Page;

SetActivePage(Page : word); - устанавливает активной страницу с номером Page. Все действия по вводу/выводу изображения будут происходить на этой странице;

ClearDevice; - очищает экран.

Задача

Составить программу, демонстрирующую на экране движение кружка справа налево.

Решение:

PROGRAM Pulsar;

Uses Crt,Graph;

var screen : byte;

Drive,Mode:integer;

x,y,x_old,y_old:word;

begin

Drive:=EGA; Mode:=EGAhi;

{режим EGAhi обеспечивает работу с двумя страницами. Можно использовать режим VGA и VGAMed для получения того же самого}

InitGraph(Drive,Mode,’e:\tp70\bgi’);

If GraphResult<>GrOk then

{ если программа управления монитором не найдена}

begin

WriteLn(‘у Вас проблемы с подключением графики’);

Halt(1) {аварийный выход из программы}

end;

x:=40; y:=120;

SetTextStyle(1,0,3);

SetActivePage(0); {активной (рабочей) объявляется страница 0}

SetColor(Cyan);

OutTextXY(100,300,’Нажмите на любую клавишу’);

SetActivePage(1); {активной (рабочей) объявляется страница 1}

SetColor(Cyan);

OutTextXY(100,300,’Нажмите на любую клавишу’);

Repeat

{рисуем первый шарик на странице 1}

SetActivePage(1); {активной (рабочей) объявляется страница 1}

SetFillStyle(1,Black);

bar(0,60,640,160); { черным прямоугольником стираем рисунок в активной графической странице}

SetColor(red);

SetFillStyle(1,LightRed);

Circle(x,y,30);

FloodFill(x,y,Red); {нарисовали круг на первом экране}

OutTextXY(x-38,y-55,’Экран 1’);

delay(200);

SetVisualPage(1); {видимой стала первая страница}

SetActivePage(0); {активной является страница 1}

SetFillStyle(1,Black);

bar(0,60,640,160); { черным прямоугольником стираем рисунок в активной графической странице}

x:=x+10;

SetColor(LightMagenta);

SetFillStyle(1,Magenta);

Circle(x,y,35);

FloodFill(x,y,LightMagenta); {нарисовали круг }

OutTextXY(x-38,y-55,’Экран 0’);

delay(200);

SetVisualPage(0);

if x<600 then x:=x+10 else {если достигли конца экрана }

begin x:=40; y:=y+10 end {возвращаемся в начало}

until (keypressed) or (y>310); {пока не нажата клавиша...}

CloseGraph

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]