| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Часть вторая: фундамент для движка Итак, мы продолжаем. Это вторая статья из серии и она посвящена в основном черновой работе, которую необходимо проделать, чтобы потом, когда начнется самое интересное, не отвлекаться по мелочам. Что же мы будем делать? Прошлая часть являлась по своей сути введением и не несла никакой практической нагрузки, хотя я и научил вас создавать объекты DirectDraw и даже менять разрешение экрана. Один вопрос: ну и что вы со всем этим будете делать?! Создание универсального модуля В прошлой части я привел процедуру загрузки "битмапа" в буфер DD. Много полезного она вам вряд ли принесла, но по крайней мере дала понять, с чем приходится иметь дело, программируя DirectDraw. Итак. в этой части я хочу, чтобы вы создали модуль, назовем его mdlDirectX, в который будете пихать все стандартные процедуры, чтобы потом забыв о том, как они работают пользоваться ими с чистой душой. В ИНете есть уже готовые модули (libDD, например), однако, создав свой модуль, вы будете более подкованы и сможете сами писать более гибкий код. Сперва, в наш модуль надо сбросить все определения API функций и переменные и ссылки на объекты, относящиеся к DD, затем, туда будут записаны все функции, служащие для работы, создания каких-либо обектов, установок, уничтожения и т. п. Далее, привожу начальный текст этого модуля с комментариями. Почему начальный? Просто сейчас, этот модуль будет на первом этапе работы, то-есть в него мы запишем минимальное количество функций, требуемых для работы. Затем, по мере дальнейшего изучения DirectX, вы сможете добавлять в этот модуль все новые и новые функции. Option Explicit ' Объявления DirectDraw 'Некоторые другие переменные
' API Declarations ' GDI32 ' USER32 Это та самая функция, которая была дана в прошлой главе. Она служит для загрузки ваших картинок со спрайтами в буфер DirectDraw, с которого вы потом будете "переводить" спрайты на рабочий экран ' Загружаем Bitmap
на буфер DirectDraw 'Загружаем bitmap из файла. Над этой строкой можно издеваться, если хотите
получить '
Получаем информацию о bitmap '
Заполняем описание surface ' Создаем
surface ' Создаем
memory device '
Выбираем bitmap в этом memory device '
Получаем surface's DC '
Копируем из memory device на DirectDrawSurface ' Release
the surface's DC ' Release
the memory device and the bitmap '
Возвращаем новый surface ' Очистка буфера
Эта процедура для полного копирования одного буфера на другой. В аргументах у нее два объекта DirectDrawSurface. Первый - источник, а второй - цель. ' Копируем весь буфер на другой Процедура не делает ничего другого, как ждет, когда начнется следующий цикл обновления экрана, после чего, завершается. Огромная скорость работы :) Sub WaitForVerticalBlank() Здесь происходит инициализация DirectDraw, создаются объекты, поверхности (Surface) и меняется разрешение экрана. В параметрах стоит режим дисплея (X x Y x Color, где Color задается в битах на пиксель (bpp)). Параметру trgtForm надо присвоить указатель на вашу главную форму, на которой будет происходить действие. Public Sub DDrawInit(ByVal X As
Long, ByVal Y As Long, ByVal Color As Long, ByVal trgtForm As Object)
'Create a front and a bitmap surfaces Call lpDD.CreateSurface(ddsd,
lpDDSFront, Nothing) Call
lpDDSFront.GetAttachedSurface(ddc, lpDDSBack) Устанавливается ColorKey, то есть цвет, который в ваших спрайтах будет прозрачным. Цвет задается в формате RGB тремя параметрами составляющих цвета (0-255) Public Sub SetColorKey(ByVal R As
Integer, ByVal G As Integer, ByVal B As Integer) Эта процедура выполняет уничтожение объектов DirectX. Если она не будет вызвана перед тем, как ваша программа закроется, появится веселая надпись типа "Программа выполнила недопустимую ошибку..." и среда VisualBasic со всем его интерфейсом GUI накроется. Public Sub DestroyDirectX() Вот эти функции понадобятся нам на первых порах. Если уж очень не хотите, можете не разбираться, как они работают, а просто пользоваться ими, как кирпичиками, далее я покажу как. Элементарнейший движок и принципы Blitting'а Ура! Все приготовления закончены и теперь можно чего-нть сотворить. Наша первая программа будет постоянно обновлять экран, прорисовывая спрайт, для упрощения задачи пока-что один. Законченный проект можете загрузить в самом конце этой главы, а пока я объясню, как работает основной цикл прорисовки. Сначала - вот его код: Private Sub Form_Load()
Как видите, главный рисующий цикл я загнал в процедуру Form_Load. Это всего-лишь фрагмент, объекты определены не здесь. Для blitting'а, то есть перевода шаблона спрайта на задний буфер использяется метод BltFast. Он достаточно быстр и легок в использовании. В качестве параметров у метода задается координаты верхнего левого угла на поверхности на которую происводится перевод, затем указывается исходный буфер, далее, передается структура RECT, определенная в Win32 TLB. В этой тсруктуре указана позиция и размеры прямоугольника со спрайтом. И наконец, передаются флаги, влияющие на работу метода. После перевода спрайта вызвается процедура из нашего модуля WaitForVerticalBlank, а затем, происходит "переворачивание" задней поверхности на переднюю. Позднее, для эффектов анимации можно использовать процедуру Sleep(ms as integer). Она вызывает задержку на указанное количество миллисекунд. Структура RECT определяется четырьмя значениями: Left,Top, Right и Bottom, которые соответственно являются координатами, задающими расположение прямоугольника со спрайтом на поверхности, содержащей его. Итак, ничего сложного нет. В следующей части мы приступим к созданию анимации. Приложения Полный
проект, содержащий код примера и модуль DirectX. [Назад][Содержание][Вперед] |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|