Стэн Трухильо - Графика для Windows средствами DirectDraw

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

До получения данных с клавиатуры остался всего один шаг: мы должны захватить устройство функцией Acquire(). Эта задача решается функцией OnActivate(), которую мы рассмотрим ниже.

Функция QwertyWin::OnCreate()завершается вызовом функции DirectDrawWin::OnCreate(), инициализирующей DirectDraw. Эта функция обсуждалась в главе 3.

Захват клавиатуры

Итак, мы инициализировали DirectInput и подготовили клавиатуру к работе; теперь необходимо захватить ее. Для этой цели используется функция OnActivate(), потому что клавиатуру приходится захватывать при каждой активизации нашего приложения. Функция OnActivate()выглядит так:

void QwertyWin::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {

DirectDrawWin::OnActivate(nState, pWndOther, bMinimized);

if (nState!=WA_INACTIVE && keyboard) {

TRACE("keyboard->Acquire()\n");

keyboard->Acquire();

}

}

После вызова версии OnActivate()базового класса мы проверяем, происходит ли активизация приложения (функция OnActivate()вызывается и в случае деактивизации, когда активным становится другое приложение). Если проверка дает положительный результат, мы вызываем функцию Acquire()интерфейса DirectInputDevice.

Перед вызовом Acquire()можно проверить, не была ли клавиатура захвачена ранее, но в этом нет необходимости. DirectInput игнорирует лишние вызовы функции Acquire().

Определение состояния клавиш

Теперь по указателю на интерфейс клавиатуры можно определить состояние отдельных клавиш. В нашей программе это происходит в функции DrawScene(), перед обновлением экрана. Функция DrawScene()приведена в листинге 6.3.

Листинг 6.3. Функция QwertyWin::DrawScene()

void QwertyWin::DrawScene() {

static char key[256];

keyboard->GetDeviceState(sizeof(key), &key);

//---------- Клавиши QWERTY --------

if (key[DIK_Q] & 0x80) BltSurface(backsurf, q_dn, 213, 70);

else BltSurface(backsurf, q_up, 213, 70);

if (key[DIK_W] & 0x80) BltSurface(backsurf, w_dn, 251, 70);

else BltSurface(backsurf, w_up, 251, 70);

if (key[DIK_E] & 0x80) BltSurface(backsurf, e_dn, 298, 70);

else BltSurface(backsurf, e_up, 298, 70);

if (key[DIK_R] & 0x80) BltSurface(backsurf, r_dn, 328, 70);

else BltSurface(backsurf, r_up, 328, 70);

if (key[DIK_T] & 0x80) BltSurface(backsurf, t_dn, 361, 70);

else BltSurface(backsurf, t_up, 361, 70);

if (key[DIK_Y] & 0x80) BltSurface(backsurf, y_dn, 393, 70);

else BltSurface(backsurf, y_up, 393, 70);

//---------------- LEFT CONTROL ---------------

if (key[DIK_LCONTROL] & 0x80) BltSurface(backsurf, lctrl_dn, 50, 180);

else BltSurface(backsurf, lctrl_up, 49, 180);

//---------------- RIGHT CONTROL ---------------

if (key[DIK_RCONTROL] & 0x80) BltSurface(backsurf, rctrl_dn, 490, 180);

else BltSurface(backsurf, rctrl_up, 490, 180);

//---------------- LEFT ALT ---------------

if (key[DIK_LMENU] & 0x80) BltSurface(backsurf, lalt_dn, 100, 260);

else BltSurface(backsurf, lalt_up, 100, 260);

//---------------- RIGHT ALT ---------------

if (key[DIK_RMENU] & 0x80) BltSurface(backsurf, ralt_dn, 440, 260);

else BltSurface(backsurf, ralt_up, 440, 260);

//---------------- SPACE -----------------

if (key[DIK_SPACE] & 0x80) BltSurface(backsurf, space_dn, 170, 340);

else BltSurface(backsurf, space_up, 170, 340);

//---------- ESCAPE -------------

if (key[DIK_ESCAPE] & 0x80) {

BltSurface(backsurf, esc_dn, 0, 0);

esc_pressed=TRUE;

} else {

BltSurface(backsurf, esc_up, 0, 0);

if (esc_pressed) PostMessage(WM_CLOSE);

}

primsurf->Flip(0, DDFLIP_WAIT);

}

Состояние устройства определяется функцией GetDeviceState()интерфейса DirectInputDevice. Тип и размер второго аргумента GetDeviceState()зависят от типа устройства, а также от формата данных, заданного функцией SetDataFormat(). Для клавиатуры функция должна получать массив из 256 байт, где каждый байт соответствует одной клавише. В DirectInput предусмотрен набор клавиатурных констант, которые используются как индексы массива и позволяют ссылаться на нужные клавиши. DirectInput обозначает нажатие клавиши установкой старшего бита того байта, который представляет данную клавишу. Объявление массива и вызов функции GetDeviceState()находятся в верхней части листинга 6.3, я снова привожу их:

static char key[256];

keyboard->GetDeviceState(sizeof(key), &key);

Адрес массива клавиш передается во втором аргументе GetDeviceState(). Первый аргумент определяет размер данных в байтах.

Все готово к проверке элементов массива. Сначала мы проверяем, была ли нажата клавиша Q:

if (key[DIK_Q] & 0x80) BltSurface(backsurf, q_dn, 213, 70);

else BltSurface(backsurf, q_up, 213, 70);

Константа DIK_Qопределяет индекс клавиши Qв массиве. Мы проверяем значение старшего бита; если бит установлен, значит, клавиша Qнажата, и мы копируем поверхность, изображающую клавишу Qв нажатом состоянии ( q_dn), функцией BltSurface(). Если клавиша не нажата, копируется поверхность q_up.

Обратите внимание: каждой клавише соответствует отдельный элемент массива, даже для функционально одинаковых клавиш. Например, две клавиши Altобрабатываются по отдельности. Кроме того, DirectInput не отличает прописных букв от строчных. Чтобы учесть регистр буквы, придется дополнительно проверить состояние обеих клавиш Shift.

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

Завершение приложения

Завершить работу DirectInput несложно — для этого достаточно освободить все интерфейсы DirectInput. В нашей программе это происходит в функции OnDestroy():

void QwertyWin::OnDestroy() {

DirectDrawWin::OnDestroy();

if (dinput) dinput->Release(), dinput=0;

if (keyboard) {

keyboard->Unacquire();

keyboard->Release(), keyboard=0;

}

}

Управление версией DirectInput

По умолчанию приложения DirectInput требуют, чтобы версия runtime-части DirectX, установленной на компьютере пользователя, совпадала с версией SDK, использованной для компиляции приложения, или превышала ее. Например, если вы создаете приложение с использованием DirectX 5 и запускаете его на компьютере с установленным DirectX 3, вызов функции DirectInputCreate()закончится неудачей.

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

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

Переопределяя стандартную константу DIRECTINPUT_VERSION, программа сообщает заголовочным файлам DirectInput о том, что необходимо обеспечить совместимость с DirectX 3. Это делается так:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Графика для Windows средствами DirectDraw отзывы


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x