Компилятор TMT Pascal не требует отдельного внешнего экранного драйвера для каждого из режимов, поскольку все необходимое находится внутри программы. Более того, вместо инициализации графического режима функцией InitGraph требуемый следует указывать явно. Сделать это можно двумя способами. Первый показан в приведенном листинге, второй заключается в использовании процедуры SetGraphMode, которой нужно передать номер режима VESA.

Как было отмечено ранее (см. предыдущую часть статьи), «мышиную» библиотеку можно оставить без изменений. Правда, при работе в режимах выше стандартного VGA следует учитывать специфику драйвера мыши, который «не знает» характеристик этих режимов и потому считает, что должен функционировать в прежнем. В частности, для текстового режима остается изменение координат с шагом 8 пикселов в пределах 0—640 и 0—200 точек по горизонтальной и вертикальной осям соответственно. Модифицирование пределов перемещения мыши проблем не вызывает — для этого предусмотрена специальная функция. А вот чтобы заставить курсор передвигаться с шагом 1 пиксел, а не 8, следует перед установкой нужного SVGA-режима предварительно определить какой-нибудь уже известный драйверу мыши графический режим, например $12 (640x480 точек и 16 цветов). В противном случае драйвер будет «считать», что по-прежнему работает в текстовом режиме.

Модуль graph библиотеки TMT Pascal содержит процедуру PutSprite более низкого уровня, чем описанная в модуле sprites. Чтобы избежать конфликта имен, при вызове любой из них следует явно указывать модуль. По умолчанию Graph.PutSprite выводит на экран спрайт в виде прямоугольника без пропусков. Чтобы включить режим учета прозрачности цвета, нужно вызвать процедуру SetTranspMode. Задавать данный режим следует после установки видео- и «виртуального» режима. Виртуальным, по терминологии, принятой разработчиками TMT Pascal, называется режим, при котором все отображение средствами модуля graph производится не на экран, а в экранный буфер. Создавать буферы следует после установки видеорежима, а уничтожать — до возвращения в текстовый режим или до изменения параметров графического режима. Если программа несколько раз модифицирует характеристики дисплея (ширину и высоту экрана, глубину цвета), используя буферы, то перед сменой режима последние необходимо уничтожать, а после замены — создавать вновь.

Отображение текста мы временно отключили, поэтому все команды, управляющие его выводом на экран, нужно «закомментировать» или исключить из текста программы. Кроме того, так как был заблокирован модуль клавиатуры, следует опять вернуться к выходу из цикла нажатием любой из клавиш и не забыть включить в число используемых модуль crt.

После внесения всех изменений программу можно запустить. По завершении отладки в режиме 800x600 точек попробуйте поменять разрешение в модуле sprites на 640x480 или на 1024x768 точек.

Модуль graph TMT Pascal в гораздо большей степени, чем соответствующий модуль Borland Pascal, приспособлен для работы с динамичной графикой, в том числе спрайтовой, поскольку в него введен целый ряд новых процедур и функций. Описание тех из них, которые были использованы в программе, приведено ниже.

SetSVGAMode(SizeX, SizeY, BPP, Mode) — установка видеорежима.
SizeX — размер экрана по горизонтали, пикселы;
SizeY — размер экрана по вертикали, пикселы;
BPP — глубина цвета, биты (возможны значения 8, 15, 16, 24 и 32 бита).

Mode — признак режима отображения видеопамяти:
LFBorBanked — режим линейного буфера или оконный (в зависимости от того, что поддерживает видеоплата);
BankedOnly — оконный режим; видеопамять адресуется фрагментами (окнами, банками) в адресном пространстве реального режима;
LFBOnly — режим линейного буфера, при котором видеопамять адресуется одним сплошным куском, доступным только из защищенного режима.

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

SetTranspMode (Mode: boolean, TransparentColor) — переключение между режимом с заданием прозрачности цвета (Mode=TRUE — точки, имеющие цвет TransparentColor, на экран не выводятся) и обычным режимом (Mode=FALSE — воспроизводятся все точки). Режим влияет только на отображение с помощью процедур: PutHTextel, PutSprite и PutImage.

PutSprite (X1, Y1, X2, Y2: Longint; var Sprite) — вывод на экран спрайта, под которым понимается двумерный массив чисел, описывающих цвета точек изображения:
X1, Y1, X2, Y2 — левая верхняя и правая нижняя координаты прямоугольника, покрываемого массивом спрайта.

GetPageSize — функция, возвращающая объем памяти в байтах, необходимый для размещения экранного буфера; эту процедуру следует вызывать только после установки определенного графического режима.

SetVirtualMode (BuffAddr: Pointer) — переключение в «виртуальный» режим, при котором весь вывод средствами модуля graph перенаправляется в расположенный по адресу BuffAddr экранный буфер.

SetNormalMode — восстановление режима, при котором вывод происходит непосредственно на экран.

FlipToScreen (BuffAddr: Pointer) — переброска на экран содержимого буфера, находящегося по адресу BuffAddr. Этот адрес не всегда совпадает с установленным процедурой SetVirtualMode. Таким образом, допустимо организовать несколько экранных буферов, заполнение и отображение на экран информации из которых может быть организовано асинхронно.

FlipToMemory (BuffAddr: Pointer) — процедура, обратная по своему действию FlipToScreen, т. е. копирующая содержимое видеопамяти в буфер. В нашей программе не используется и приведена лишь для полноты. Применять ее часто не рекомендуется — она выполняется существенно медленнее, чем FlipToScreen. Процедура FlipToMemory (BuffAddr: Pointer) подходит лишь для однократного (не повторяющегося на каждом кадре) заполнения буфера.


Окончание. Начало см. в № 12/02


Листинг