Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
82
Добавлен:
15.02.2016
Размер:
4.77 Mб
Скачать

К лабораторной работе № 8

Цель работы: приобретение практических навыков в разработке и отладке программ для работы с динамической графикой.

Структура создаваемой программы: установка экранного режима; выполнение статичного изображения, блок движения изображения.

Установка экранного режима осуществляется операторами SCREEN и COLOR. В данной работе используется SCREEN 9.

Для осуществления динамики иногда требуется нарисовать не одно статичное изображение. Приемы создания статичных рисунков рассмотрены в работе № 7. Контур страны проще рисовать оператором DRAW в масштабе, задаваемом координатной сеткой. Потом размер рисунка можно увеличить до необходимого соответствующей масштабирующей командой Sn оператора DRAW. Блок ввода и распечатки городов можно организовать с помощью цикла FOR… NEXT, в тело которого войдет оператор READ m1$(i), m2(i), m3(i), x(i), y(i) и соответствующие ему DATA, например, DATA "Рим", 10, 57, 443, 135, где m1$(i) вводит название города, m2(i) и m3(i) – параметры оператора LOCATE, предваряющего оператор PRINT, который выводит на экран название города, x(i), y(i) – координаты изображающей город точки (рисовать либо парой операторов CIRCLE – PAINT, либо LINE).

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

  1. Выводить изображение различными цветами переднего плана, а стирать, выводя то же самое изображение цветом фона.

  2. Выводить, как в предыдущем, а стирать - оператором CLS.

  3. Выводить, как в предыдущем, а стирать – прямоугольником, цвет контура и заливки которого совпадает с цветом фона.

  4. Выводить как в предыдущем, а стирать задние фронты изображения.

  5. Записать изображение в буфер, размещаемый в динамической памяти, а затем выводить его в нужных местах экрана. Стирать повторным наложением изображения из буфера, либо одним из способов п.п.2,3.

Существуют и другие способы, здесь не приводимые. Наиболее качественное изображение получается 4-м способом, но он достаточно легко реализуется лишь в случае прямолинейного движения.

При выполнении "туристских" заданий предлагается воспользоваться 5-м способом, стирая изображение прямоугольником.

Структура программы: 1) Блок рисования карты страны посредством оператора DRAW, 2) Блок ввода и распечатки городов, 3) Блок рисования и снятия в буфер изображения парохода (яхты) или автобуса (машины), 4) Блок движения транспортного средства, 5) Подпрограмма вывода сообщений.

При рисовании карты лучше использовать команды с относительными координатами, чтобы можно было рисовать по сетке, а затем использовать команду масштаба Sn.

В блоке снятия изображения в буфер сначала рисуется изображение парохода (яхты, автобуса или машины, в зависимости от варианта), которое затем копируется оператором GET. Рассмотрим этот блок:

'==3== Блок снятия изображения парохода =================

120 'Рисует пароход

130 b = 4 + INT((55+7) / 8418) 'Расчет объема памяти

140 REDIM bug1(b) 'Задает буфер для запоминания

150 GET (460, 23)-STEP(54, 17), bug1 'Снимает картинку

160 SLEEP 2 'Начальная выдержка времени

170 LINE (460, 23)-STEP(54, 17), 9, BF 'Стирает картинку

'=================================================

Оператор LINE из строки 170 используется сначала с параметром В для определения параметров оператора GET в строке 150 и значений для формулы в строке 130. Изображение должно полностью помещаться в рамке оператора LINE, тогда координаты из него переносятся в GET, а разности координат дают значения для формулы. После чего параметр B оператора LINE переделывается в BF, а цвет изменяется на цвет фона. Размер массива в байтах вычисляется по формуле:

4 + INT(((x2 – x1 +1)  k1 + 7) / 8)  k2  ((y2 – y1) + 1)

Таблица 0.8.1.

Режим экрана

Битов на точку в одном слое (k1)

Число слоев (k2)

Режим экрана

Битов на точку в одном слое (k1)

Число слоев (k2)

SCREEN 1

2

1

SCREEN 10

1

2

SCREEN 2

1

1

SCREEN 11

1

1

SCREEN 7

1

4

SCREEN 12

1

4

SCREEN 8

1

4

SCREEN 13

8

1

SCREEN 9

1

4

Значит для SCREEN 9 формула будет следующего вида:

4 + INT(((x2 – x1 + 1)  1 + 7) / 8)  4  ((y2 – y1) + 1)

В блоке движения теплохода организуется цикл WHILE…WEND либо DO…LOOP, в котором сначала оператором PUT изображение парохода выводится на экран, а затем после выдержки времени, задаваемой пустым циклом FOR i = 1 TO n: NEXT i, стирается оператором LINE (x1, y1)-(x2, y2), k, BF. Приращение координат задается в циклах следующим образом:

x = x + dx и y = y + dy

Следует заметить, что эти циклы позволяют осуществлять движение одновременно нескольких изображений, задавая каждому свои переменные для координат (x1, y1; x2, y2; x3, y3 и т.д.).

Траектория движения формируется путем изменения значений dx и dy в точках перелома. Осуществляется это посредством условного оператора IF…THEN, например:

IF x => 220 AND dy = 1 THEN dy = -1: dx = .1: SLEEP 2

Задавать условие надежнее знаком =>, так как при некоторых dx (например, dx = 0.3) можно проскочить значение x = 220.

Значение dy (или dx) в условии необходимо для того, чтобы зафиксировать срабатывание условия на нужном участке траектории, исключив срабатывание на ненужном (например, чтобы срабатывало при движении парохода "вниз" и не было бы ненужного срабатывания при движении "вверх").

В процессе формирования траектории может возникнуть необходимость прерывания выполнения программы, что можно сделать, нажав комбинацию клавиш Ctrl+Break. Посмотреть результат на экране вывода можно с помощью клавиши F4 (возврат – повторным нажатием). После использования комбинации Ctrl+Break запуск программы производится комбинацией клавиш Shift+F5, а не просто F5.

Условие выхода из цикла может быть, например, c< >1, оформляемое с помощью условного оператора IF…THEN:

WHILE c< >1 DO

… …

IF x = 200 AND dy = -1 THEN c = 1 IF x = 200 AND dy = -1 THEN EXIT DO

… …

WEND LOOP

Направление движения транспортного средства зависит от значенийdx и dy. Его удобно определять с помощью следующей диаграммы. Отметим, что dx и dy не обязательно равны 1, как на диаграмме. Очевидно, что при dx = 1.4 и dy = 1.4 направление движения будет таким же, как и при dx = 1 и dy = 1. Только увеличится скорость движения.

При формировании траектории рекомендуется начинать с IF THEN EXIT DO, поставив в качестве условия координату 1-й остановки, например, Анконы. Затем в IF THEN EXIT DO ставится координата следующего города Бари, а координата Анконы переносится в качестве условия в новый IF THEN, поставленный раньше, в котором задаются новые dx и dy. Так, добавляя другие IF THEN, формируем всю траекторию движения.

Пояснительный текст выводится на экран посредством подпрограмм, например, для Анконы Итальянского круиза. Пусть обращение к подпрограмме производится оператором GOSUB 200

190 GOTO 600

'===5======== Подпрограмма Анкона ============

200 LINE (0, 40)-(260, 350), 0, BF

210 LOCATE 5, 2

220 PRINT "Анкона, стоянка 1 день"

230 PRINT "Автобусная экскурсия по городу."

240 PRINT "Дегустация ''Кьянти'' в местных погребках"

250 RETURN

'=================================================

Используя оператор SELECT CASE, можно организовать подпрограмму вывода сообщений следующим образом:

'==5===== Подпрограмма вывода сообщений ===============

500 ng = ng +1: m12 = 19: m22 = 3

510 LINE (5, 240)-STEP(190, 80), 0, BF: LINE (5, 240)-STEP(190, 80), 8, B

SELECT CASE ng

CASE 1: m33$ = "Венеция": m34$ = "Стоянка 1 день"

M35$ = "Осмотр города": m36$ = "Посадка на яхту"

CASE 2: m33$ = "Анкона": m34$ = "Стоянка 1 день"

M35$ = "Осмотр города": m36$ = "Дегустация "Кьянти" в погребках"

END SELECT

560 LOCATE m12, m22: PRINT m33$: LOCATE m12 + 1, m22: PRINT m34$

570 LOCATE m12 +2, m22: PRINT m35$: LOCATE m12 + 3, m22: PRINT m36$

SLEEP 2

RETURN

'=================================================

В строке 500 задаются параметры для операторов LOCATE в строках 560-570. Операторы LINE в строке 510 стирают предыдущее сообщение и рисуют рамку вокруг сообщения. Сообщения распечатываются операторами PRINT в строках 560-570. Оператор SLEEP дает время для прочтения сообщения.

Таблица 0.8.2.

Оператор и его описание

PALETTE 1, 2

Оператор установки цвета, изменяющий в палитре цвет 1 (синий) на цвет 2 (зеленый).

PALETTE

Оператор без параметров восстанавливает цвета палитры, установленные системой по умолчанию (возврат в первоначальное состояние).

PALETTE USING PAL%(2)

Оператор изменяет цвета палитры в соответствии со значениями массива PAL%, начиная со 2-го элемента массива. Можно с его помощью переустановить цвета всей палитры.

Оператор и его описание

PUT (100, 200), bug1, PSET

Графический оператор, рисующий на экране изображение, взятое в массив bug1 оператором GET, начиная с точки с координатами x = 100, y = 200 (левый верхний угол прямоугольника). Переводит данные точка за точкой на экран. Каждая точка имеет тот же цветовой атрибут, что и при считывании.

PUT STEP(100, 10), bug1, PRESET

Графический оператор, рисующий изображение из массива bug1, начиная с точки (пусть последняя точка x = 10, y = 20) c координатами x = 110, y = 30, выдавая инверсное изображение ("негатив").

PUT (20, 10), bug2, AND

Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку. Точки, имеющие одинаковый цвет сохраняются, остальные меняют цвет.

PUT (20, 10), bug2, OR

Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку.

Новое изображение не стирает предыдущего.

Окончание табл. 0.8.2.

PUT (20, 10), bug2, XOR

Графический оператор, рисующий изображение из массива bug2, начиная с точки x = 20, y = 10. Изображение накладывается на существующую картинку.

Действует так, что точки на экране, имеющие тот же цвет, что и образ, инвертируются. При повторном наложении образа предыдущая картинка восстанавливается. XOR устанавливается по умолчанию.

POINT(0)

Оператор возвращает координату x последней (текущей) точки

POINT(1)

Оператор возвращает координату y последней (текущей) точки

POINT (10, 20)

Оператор возвращает цвет точки (число) с координатами x = 10, y = 20

GET (10, 10)-(120, 110), bug1

Графический оператор, считывающий изображение с прямоугольного участка экрана, с координатами верхней левой точки x = 10, y = 10, и нижней правой – x = 120, y = 110, в массив bug1.

GET STEP(10, 10)-STEP(20, 10), bug1

Графический оператор, считывающий изображение с прямоугольного участка экрана (пусть последняя точка x = 20, y = 10) с координатами верхней левой точки x = 30, y = 20 и нижней правой – x = 50, y = 30 в массив bug1.

Примечание: 1. Если в программе использовался оператор PALETTE с параметрами, необходимо перед END поставить просто PALETTE.

ЛИТЕРАТУРА

  1. Алиев В.К. Язык Бейсик. – М.: СОЛОН-Р, 2000.

  2. Бобровский С. Программирование на языке QBasic для школьников и студентов. – М.: ДЕСС КОМ, Инфорком-Пресс, 2000.

  3. Зельднер Г.А. QuickBasic. – М.: ABF, 1994.

  4. Колесов Н.В., Ганитулин А.Х. Программирование на алгоритмических языках для ПЭВМ: Учебное пособие. – СПб.: Изд-во СПбТИС, 1997.

  5. Мельникова О.И., Бонюшкина А.Ю. Начала Программирования на языке QBasic. – М.: ЭКОМ, 2000.

  6. Очков В.Ф., Рахаев М.А. Этюды на языках QBasic, QuickBasic, Basic Compiler. – М.: "Финансы и статистика", 1995.

  7. Сафронов И.К. Бейсик в задачах и примерах. – СПб.: "БХВ-Петербург", 2000.

  8. Федоренко Ю. Алгоритмы и программы на Qbasic: Учебный курс. – СПб.: Питер, 2002.

Приложение 1