Direct Input. Клавиатура.

Содержание статьи:

Введение.
Инициализация.
Использование.

Введение.

Введение.

к началу статьи
Привет всем. Задумывались ли Вы когда-нибудь о том, из каких частей состоит игровой движок? Несомненно это рендер (почему-то его всегда называют первым :)) ), физика, лоадеры всего и вся, плагины к различным программам, скриптовая система, партиклы, звук, GUI, эффекты, шейдеры… Ничего не забыли? Ну конечно! Программа должна быть интерактивна! Кому интересно смотреть на двигающиеся сами по себе модельки, пускай даже очень красивые и хорошо анимированные. Никому. Посему в этом уроке мы продолжим осваивать Direct Input, и будет интересовать нас исключительно клавиатура.

Инициализация.

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

#include <dinput.h>

#pragma comment ( lib , "dinput8.lib" )
#pragma comment ( lib , "dxguid.lib" )

class	cDIObject{
public:
	LPDIRECTINPUT8		Object;

	cDIObject( void ){Object = NULL;}
	~cDIObject(){}

	LPDIRECTINPUT8		operator->(){return( Object );}

	bool			InitDirectInput( HINSTANCE );
	void			Release( void );
};

cDIObject			DIObject;
В этом классе со времён предыдущего урока ничего не изменилось, поэтому сразу приступим к написанию класса клавиатуры:

class	cKeyboard{
	LPDIRECTINPUTDEVICE8	DIKeyboard;
	char			*Buffer;
public:
	cKeyboard( void ){DIKeyboard=NULL;Buffer=NULL;}
	virtual			~cKeyboard(){}
	virtual bool		InitKeyboard( cDIObject & , HWND );
	virtual void		Release( void );
	virtual bool		GetKeyboardState( void );
	virtual bool		GetButtonState( char );
};

cKeyboard			Keyboard;
Итак, нам нужно инициализировать девайс Direct Input’а и установить необходимые настройки. Для этих целей создадим следующую функцию:

bool			cKeyboard::InitKeyboard( cDIObject &DIObject , HWND hWnd ){
	Buffer = new char[ 256 ];

	if( DIObject->CreateDevice( GUID_SysKeyboard , &DIKeyboard , NULL ) != DI_OK ){
		MessageBox( 0 , "Ошибка создания девайса для клавиатуры." , "Ошибка" , 0 );
		return( false );
	}

	if( DIKeyboard->SetDataFormat( &c_dfDIKeyboard ) != DI_OK ){
		MessageBox( 0 , "Ошибка установки формата клавиатуры." , "Ошибка" , 0 );
		return( false );
	}

	if( DIKeyboard->SetCooperativeLevel( hWnd , DISCL_BACKGROUND | DISCL_NONEXCLUSIVE ) != DI_OK){
		MessageBox( 0 , "Ошибка установки Cooperative Level'а для клавиатуры." , "Ошибка" , 0 );
		return( false );
	}

	if( DIKeyboard->Acquire() != DI_OK ){
		MessageBox( 0 , "Ошибка получения доступа к клавиатуры." , "Ошибка." , 0 );
		return( false );
	}

	return( true );
}
В которой сначала создаем девайс - DIObject->CreateDevice(GUID_SysKeyboard, &DIKeyboard , NULL ), GUID_SysKeyboard говорит, что это будет девайс клавиатуры а не мыши или упаси боже джойстика. Далее устанавливаем формат данных - DIKeyboard->SetDataFormat( &c_dfDIKeyboard ), для того чтобы девайс знал какие части инициализируемого устройства будут использоваться (для мыши и клавиатуры это кнопки, для джойстика это ещё и оси). Потом устанавливаем стратегию доступа к устройству DIKeyboard->SetCooperativeLevel( hWnd , DISCL_BACKGROUND | DISCL_NONEXCLUSIVE ). Теперь остается только получить доступ к клавиатуре - DIKeyboard->Acquire(). Клава готова к использованию!

Использование.

к началу статьи
Инициализация:

if( !Keyboard.InitKeyboard( DIObject , hWnd ) ){
	exit( 0 );
}
Опрос клавиатуры (эту функцию я здесь приводить не буду, так как она довольно простая):

Keyboard.GetKeyboardState();
Смотрим, какие кнопки нажаты:

if( Keyboard.GetButtonState( DIK_ESCAPE ) ){
	exit( 99 );
}
Правда просто? После последних двух уроков, ничто не помешает Вам сделать Ваши игры настолько интерактивными насколько это возможно. А пока разрешите откланяться.

к началу статьи

ЗЫ: способ связи прежний dodonov_a_a@inbox.ru


Смежные вопросы:
Урок 1. Инициализация. Вершинные буфферы и камера.
Урок 2. Проигрывание медиа-файлов.
Урок 3. Автоматизация загрузки и управления аудио и видео ресурсами.
Урок 4. Текстурирование. Текстурный менеджер.
Урок 5. Шрифты в Direct3D.
Урок 6. Элементы управления.
Урок 7. Вершинные шейдеры версии 1.0.
Урок 8. Система частиц.
Урок 9. Рендерринг в текстуру.
Урок 10. Direct Input. Мышь.
Исходные коды.
© 2004-2005 Savardge.ru


Hosted by uCoz