Смекни!
smekni.com

Игра Tetris (стр. 2 из 3)

Изображение фона мы получили из Bmp-файла, из таких же файлов взят, курсор мыши и элементы интерфейса. Теперь необходимо правильно считать Bmp-файлы и перевернуть картинку «с головы на ноги».

По решению разработчиков формат Bmp-файла не привязан к конкретной аппаратной платформе. Этот файл состоит из четырех частей: заголовка, информационного заголовка, таблицы цветов (палитры) и данных изображения. Если в файле хранится изображение с глубиной цвета 24 бита (16 млн. цветов), то таблица цветов может отсутствовать, однако в нашем, 256-цветном случае она есть. Структура каждой из частей файла, хранящего 256-цветное изображение, дана в таблице 1.

Структура Bmp-файла
Имя Длина Смещение Описание
Заголовок файла (BitMapFileHeader)
Type 2 0 Сигнатура "BM"
Size 4 2 Размер файла
Reserved 1 2 6 Зарезервировано
Reserved 2 2 8 Зарезервировано
OffsetBits 4 10 Смещение изображения от начала файла
Информационный заголовок (BitMapInfoHeader)
Size 4 14 Длина заголовка
Width 4 18 Ширина изображения, точки
Height 4 22 Высота изображения, точки
Planes 2 26 Число плоскостей
BitCount 2 28 Глубина цвета, бит на точку
Compression 4 30 Тип компрессии (0 - несжатое изображение)
SizeImage 4 34 Размер изображения, байт
XpelsPerMeter 4 38 Горизонтальное разрешение, точки на метр
YpelsPerMeter 4 42 Вертикальное разрешение, точки на метр
ColorsUsed 4 46 Число используемых цветов (0 - максимально возможное для данной глубины цвета)
ColorsImportant 4 50 Число основных цветов
Таблица цветов (палитра) (ColorTable)
ColorTable 1024 54 256 элементов по 4 байта
Данные изображения (BitMap Array)
Image Size 1078 Изображение, записанное по строкам слева направо и снизу вверх

Заголовок файла начинается с сигнатуры «BM», а затем идет длина файла, выраженная в байтах. Следующие 4 байта зарезервированы для дальнейших расширений формата, а заканчивается этот заголовок смещением от начала файла до записанных в нем данных изображения. При 256 цветах это смещение составляет 1078.

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

Ширина и высота изображения задаются в точках растра и пояснений, пожалуй, не требуют.

Количество плоскостей могло применяться в файлах, имеющих небольшую глубину цвета. При числе цветов 256 и больше оно всегда равно 1.

Глубина цвета считается важнейшей характеристикой способа представления цвета в файле и измеряется в битах на точку. В данном случае она равна 8.

Компрессия. В Bmp-файлах обычно не используется, но поле в заголовке для нее предусмотрено. Обычно она равна 0, и это означает, что изображение не сжато.

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

Горизонтальное и вертикальное разрешения измеряются в точках растра на метр. Они особенно важны для сохранения масштаба отсканированных картинок. Изображения, созданные с помощью графических редакторов, как правило, имеют в этих полях нули.

Число цветов позволяет сократить размер таблицы палитры, если в изображении реально присутствует меньше цветов, чем это допускает выбранная глубина цвета. Однако на практике такие файлы почти не встречаются. Если число цветов принимает значение, максимально допустимое глубиной цвета, например 256 цветов при 8 битах, поле обнуляют.

Число основных цветов — идет с начала палитры, и его желательно выводить без искажений. Данное поле бывает важно тогда, когда максимальное число цветов дисплея было меньше, чем в палитре Bmp-файла. При разработке формата, очевидно, принималось, что наиболее часто встречающиеся цвета будут располагаться в начале таблицы. Сейчас этого требования практически не придерживаются, т. е. цвета не упорядочиваются по частоте, с которой они встречаются в файле. Это очень важно, поскольку палитры двух разных файлов, даже составленных из одних и тех же цветов, содержали бы их (цвета) в разном порядке, что могло существенно осложнить одновременный вывод таких изображений на экран.

За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех — компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0.

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

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

2.2 Алгоритм решения задачи

2.3 Структура программы

Программа состоит из 27 файлов. Основным файлом является файл Igra.pas к нему подключены остальные файлы, к которым в свою очередь подключены другие. Проще это подключение представить на графической схеме (рис.3).

2.4 Процедуры и функции

function Clock {время, прошедшее с запуска программы в 1/18 с}

procedure ResetTime; {сброс всех показаний времени в 0}

function GetFPS {текущее число кадров в секунду необходимо вызывать 1 раз в каждом кадре}

function Clock {время, прошедшее с запуска программы в 1/18 c}

procedure ResetTime; {сброс всех показаний времени в 0}

function GetFPS : single;

{текущее число кадров в секунду}

procedure SetTextParm {установка параметров вывода текста}

{color- цвет текста}

{bkcolor- цвет фона}

{typetext = 0 - прозрачный фон}

{typetext = 1 - непрозрачный фон }

procedure GetTextParm (var color,bkcolor,typetext:byte); { запростекущихпараметров }

procedure PutText (x,y:word;text:string); {выводтекстапокоординатам x,y (верхнийлевыйугол)}

procedure PutChar (x,y:word;chr:char); {выводсимволапокоординатам x,y (верхнийлевыйугол)}

procedure PutPixel (x,y:word;c:byte); {выводточки}

functiongetpixel (x,y:word):byte; {запросцветаточки}

procedure PutPixel (x,y:word;c:byte); {выводточки}

function getpixel (x,y:word):byte; {запросцветаточки}

procedure PutPixel (x,y:word;c:byte); {выводточки}

function getpixel (x,y:word):byte; {запросцветаточки}

procedure GetBuffer (Sprite:SpriteType); {сохранениефонаподспрайтомвбуфере}

procedure PutBuffer (Sprite:SpriteType); {восстановлениефона}

procedure PutSprite (Sprite:SpriteType); {выводспрайтанаэкран}

procedure CreateSprite (s:string; x,y,dx, dy:integer; var Sprite:SpriteType); {"создание" спрайта}

procedure DestroySprite (Sprite:SpriteType); {"уничтожение" спрайта}

procedure CalcSpritePosition (var Sprite:SpriteType); {вычислениеновыхкоординатспрайта}

procedure PutBackground (s:string); {созданиефонанаэкране}

procedure CreateScreenBuffer; {созданиеэкранногобуфера}

procedure DestroyScreenBuffer; {уничтожениеэкранногобуфера}

procedure ScreenBufferToScreen; {отображениебуферанаэкран}

procedure CreateScreenBuffer; {созданиеэкранногобуфера}

procedure DestroyScreenBuffer; {уничтожениеэкранногобуфера}

procedure ScreenBufferToScreen; {отображениебуферанаэкран}

procedure GetBuffer (Sprite:SpriteType); {сохранениефонаподспрайтомвбуфере}

procedure PutBuffer (Sprite:SpriteType); {восстановлениефона}

procedure PutSprite (Sprite:SpriteType); {выводспрайтанаэкран}

procedure CreateSprite {"создание" спрайта}

procedure DestroySprite (Sprite:SpriteType); {"уничтожение" спрайта}

procedure CalcSpritePosition (var Sprite:SpriteType);

procedure PutBackground (s:string); {созданиефонанаэкране}

procedure SetPal (var pal:byte;nbegpal,lenpal:integer); {установка 256-цветнойпалитры}

procedure GetPal (var pal:byte;nbegpal,lenpal:integer); {чтение 256-цветнойпалитры}

procedure WaitVerticalRetrace; {ожидание вертикально обратного хода луча}

procedure BlackPal; {установка "черной" палитры}

procedure FadeOut (p:array of byte); {плавноегашениепалитры}

procedure FadeIn (p:array of byte); {плавнаяустановкапалитры}

procedure SetPal (var pal:byte;nbegpal,lenpal:integer); {установка 256-цветнойпалитры}

procedure GetPal (var pal:byte;nbegpal,lenpal:integer); {чтение 256-цветнойпалитры}

procedure WaitVerticalRetrace; {ожидание вертикально обратного хода луча}

procedure BlackPal; {установка "черной" палитры}

procedure FadeIn (p:array of byte); {плавная установка палитры}

procedure FadeOut (p:array of byte); {плавное гашение палитры}

Function IsMouse: Boolean; {Возвращает TRUE, если мышь доступна}

Function InitMouse: Boolean; {Инициациямыши}

Procedure SetMousePage (Page: Byte); {Устанавливает страницу для указателя мыши}

Function GetMousePage: Byte; {Возвращает номер страницы с указателем}

Procedure SetStepToPixel (Hor,Ver: Integer); {Устанавливает чувствительность мыши}

Procedure GetStepToPixel (var Hor,Ver: Integer); {Возвращает чувствительность мыши}

Procedure SetDoubleSpeed (Speed: Word); {Устанавливает порог удвоения скорости перемещения указателя}

Function GetDoubleSpeed: Word; {Возвращает порог удвоения скорости}

Function MouseTextCooX (X: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной}

Function MouseTextCooY (Y: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной}