Программирование графики

Вывод спрайтов

Xakep, номер #041, стр. 041-077-1


Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

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

Теория спрайтов

До появления 3D ускорителей спрайтовая графика была единственным способом создания игр. Даже самый знаменитый и на первый взгляд трехмерный Doom был полностью двухмерным и напичкан спрайтами. Все монстры - это просто заранее подготовленные картинки, а такие вещи, как оружие или аптечки, вообще не знали о существовании третьего измерения.

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

Посмотри на рисунок 1. На нем показана вполне реальная последовательность спрайтов. Если последовательно воспроизвести каждый из спрайтов, то может возникнуть ощущение трехмерности самолета, который наклоняется в твою сторону. А если еще и постепенно двигать эти картинки по ходу движения самолета, то можно окончательно обмануть твое зрение. Хорошо прорисованные спрайты могут создать ощущение реального мира. Если ты хоть иногда используешь свой комп для игр, то ты понимаешь, о чем я говорю.

Подготавливаем картинку

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

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

Для начала вспомним предыдущий урок. На нем мы создали первое полноэкранное DirectX приложение и научились создавать главную поверхность, на которой можно рисовать. Напоминаю, что поверхность - это просто область памяти. Эта область может находиться как в памяти видеокарты, так и в оперативке. Первичная поверхность всегда находится в памяти видюхи, и все, что отображено на ней, сразу отображается на мониторе. Запись в эту поверхность равносильна рисованию по самому экрану.

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

Поверхность для картинки

Для начала открой проект, созданный в предыдущем номере Х, сейчас мы его доработаем. Перемещаемся в раздел var и рядом с объявлением первичной поверхности описываем еще одну:

FImageSurface: IDirectDrawSurface7;

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

Содержание  Вперед на стр. 041-077-2