Главная » 2D графика » Способы хранение графики в играх и бизнес приложениях

RSS

Способы хранение графики в играх и бизнес приложениях

Не нравитсяНравится   Рейтинг 0

Пример приведённый выше далеко не оптимален:

1. Во первых, присутствует несколько лишних переменных. Это сделано только для большей понятности кода.
2. В коде всего одна проверка – это очень не правильно :) Нужно сопровождать каждую операцию проверками на нулевой указатель, правильность размера структуры и т.д. Самая простая – на существование запрошенного изображения, а то может получится такая ситуация, что всего в ресурсе 10 растров, а запрашиваем 1001. Процедура попытается читать данные из совсем «левой» области памяти. Мы ведь работаем с нетипизированными указателями, напрямую с памятью и ошибки вызовут крах всего приложения.

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

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

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

Создадим ресурсный файл MusicRec.RC и в него добавим строчку:

1
MUSIC1 RCDATA sample.mp3

Соберём бинарный файл ресурса командой:

1
brcc32.exe MusicRec.RC

и подключим к нашему приложению скомпилированный ресурсный файл:

1
{$R MusicRec.RES}

После этих операций в нашем exe файле будет присутствовать MP3 фрагмент sample c идентификатором MUSIC1.

Нам осталось только проиграть данный файл. Что для этого потребуется ? Конечно проигрыватель. Все конечно же подумали про WinAMP, но это же проигрыватель внешних файлов, к тому же не интересно привязывать нашу программу к WinAMP’у.

Среди свободно распространяемых проигрывателей я выбрал библиотеку BASS. Во первых она позволяет проигрывать не только MP3 файлы, но и файлы трекерных форматов XM, MOD и т.д., что очень актуально для игр и демонстраций. Ведь эти файлы занимают очень мало места, а качество музыки на очень приличном уровне. Еще один большой плюс библиотеки BASS – её бесплатность для не коммерческого использования. К тому же она распространяется в виде динамической библиотеки с открытым интерфейсом и очень проста в использовании – я буквально за 10 минут написал этот пример, при этом ранее библиотеку никогда не видел.

Собственно работа со звуком заключается в 4-х операциях:

Инициализация биьлиотеки.
Загрузка звукового фрагмента.
Воспроизведение.
Освобождение ресурсов.

Нам интересен кусочек загрузки музыкального фрагмента из памяти, по этому я рассмотрю только его.

1
2
3
4
5
6
7
8
9
10
11
var
  RSRC : HRSRC;
  RES : THandle;
  P : Pointer;
...
RSRC:=FindResource(HInstance, 'MUSIC1', RT_RCDATA);
...
RES:=LoadResource(HInstance, RSRC);
P:=LockResource(RES);
Music:=BASS_SampleLoad(TRUE, P, 0, MusicSize, 3, BASS_SAMPLE_OVER_POS);
...

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

Для лучшего осмысления работы библиотеки BASS посмотрите пример BassTest входящий в комплект поставки.

Вот собственно и всё. В следующий части статьи я поробую рассказать о хранении компрессованных ресурсов.

Список ссылок

Страницы : 1 2 3 4