Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

Краснов Михаил

Шрифт:
empty-line/>

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

procedure TWarrior.Show;

begin

if Direction = dirRight

// rcRect устанавливается в координатах образа, хранящего все картинки

then SetRect (rcRect, 0, 70, SpriteWidth, 70 + SpriteHeight)

else SetRect (rcRect, SpriteWidth, 70, 2 * SpriteWidth, 70 +

SpriteHeight);

//

Осуществляется блиттинг FDDSImages, а не поверхности спрайта

frmDD.FDDSBack.BltFast(PosX, PosY, frmDD.FDDSImages, @rcRect,

DDBLTFAST_DONOTWAIT or DDBLTFAST_SRCCOLORKEY);

end;

Также этот пример отличается от предыдущего тем, что пространство игры не ограничивается одним экраном, воин может продвигаться дальше правой границы, всего я использую два растровых фона, каждый размером 640x480 пикселов. Напоминаю, что некоторые видеокарты не позволяют создавать поверхности, превышающие в размерах первичную поверхность. Поэтому для хранения этих растров использую две поверхности - Foosone и FDDSTWO. Значение целочисленной переменной iftRect указывает ширину прямоугольника, вырезаемого из второй поверхности:

SetRect(rcRectOne, IftRect, 0, ScreenWidth, ScreenHeight);

// Первый фон

FDDSBack.BltFast(0, 0, FDDSOne, @rcRectOne, DDBLTFAST_WAIT);

if IftRect > 0 then begin // Присутствует ли часть второго фона

SetRect(rcRectTwo, 0, 0, IftRect, ScreenHeight);

FDDSBack.BltFast(ScreenWidth - IftRect, 0, FDDSTwo, SrcRectTwo,

DDBLTFAST_WAIT);

end;

Работа с клавиатурой

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

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

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

как частота повтора символов для клавиатуры или чувствительность мыши, не влияют на скорость ввода.

Directlnput использует модель СОМ. Посему, после изучения DirectDraw, нам будет легко знакомиться с ним: мы встретим здесь знакомые понятия главного объекта и интерфейсов.

Разбирая очередной пример (проект каталога Ех05), я попутно расскажу об основных понятиях библиотеки Directlnput. По виду пример представляет собой обычное оконное приложение, в компоненте класса тмето выводятся скан-коды нажимаемых клавиш, нажатие кнопки Clear приводит к очистке его содержимого (рис. 5.6).

В списке "uses помимо обычных для Delphi модулей мною вписан DirectlnputS.

Глобальная переменная Dlnput обеспечивает доступ к функциям Directinput:

var

Dinput : IDIRECTINPUT8 = nil; // Главный объект Directinput

// Интерфейс доступа к устройству ввода

DIKeyboard : IDIRECTINPUTDEVICE8 = nil;

Впервые в наших примерах мы обращаемся к интерфейсам именно восьмой версии DirectX. Обращу внимание на это событие, чтобы оно не прошло для вас незамеченным.

Следующая пользовательская функция предназначена для подготовки работы (обработку ошибок оставлю только для первого действия):

function TfrmDX.Or.CreateDevlce : HRF.SULT;

var

hRet : HRESULT; // Результат действий

dipdw : TDIPROPDWORD; // Вспомогательная структура, задание параметров

begin

// Создание главного объекта Directlnput

hRet := DirectlnputSCreate (hlnstance, DIRECTINPUT_VERSION,

IID_IDirectInput8, DInput, nil);

if Failed (hRet) then begin

Result := hRet;

Exit

end;

// Создание объекта ввода информации от клавиатуры

hRet := DInput.CreateDevice (GUID_SysKeyboard, DIKeyboard, nil);

// Задаем формат данных, получаемых от устройства

hRet := DIKeyboard.SetDataFormat(c_dfDIKeyboard);

// Задаем уровень кооперации

hRet := DIKeyboard.SetCooperativeLevel(Handle, DISCL_NONEXCLUSIVE or

DISCL_BACKGROUND);

// Параметры для буферной схемы получения данных

ZeroMemory (Sdipdw, SizeOf (dipdw)); with dipdw do begin

diph.dwSize := SizeOf(TDIPROPDWORD);

diph.dwHeaderSize := SizeOf(TDIPROPHEADER);

diph.dwObj := 0;

diph.dwHow := DIPHJDEVICE;

dwData := SAMPLE_BUFFER_SIZE;

end;

// Задаем параметры буфера

hRet := DIKeyboard.SetProperty(DIPROP_BUFFERSIZE, dipdw.diph);

// Установили связь с устройством ввода

Result := DIKeyboard.Acquire;

end;

Для создания главного объекта из библиотеки Directlnput должна использоваться функция DirectlnputSCreate. Аргументы ее таковы:

Поделиться:
Популярные книги

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад