| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Статьи:: Графика и игроделание DirectX, OpenGL etc.) :: Direct3D :: Использование клавиатуры средствами DirectInput
Использование клавиатуры средствами DirectInput
После достаточно долгого ожидания я выкладываю на суд общественности новые туториалы. Посвящены они будут использованию пользовательского ввода и обработке его средствами DirectInput8. Сперва займемся самым простым - клавиатурой. Для осуществления обработки ввода пользователя я создал специальный класс, в котором сделал все, что нужно для работы DInput. Пока в данном классе присутствует лишь часть, отвечающая за сам DirectInput и часть, дающая нам возможность работать с клавиатурой. В последующих уроках мы разберем как использовать мышку и джойстик. Вот прототип данного класса :
class csc_DInput
{
private:
LPDIRECTINPUT8 p_dinput;
void Accure (void);
void UnAccure (void);
public:
csc_DInput ();
~csc_DInput ();
int CreateDInput (HINSTANCE);
int CreateKeyboard (HWND);
void Destroy (void);
void Update (void);
class _keyboard
{
friend class csc_DInput;
private:
LPDIRECTINPUTDEVICE8 p_dev;
void Update (void);
bool bActive;
bool bUse;
unsigned char keys[256];
public:
bool IsActive (void) { return bActive; };
bool IsButD (DWORD);
bool IsAnyButD (void);
} keyboard;
};
он выглядит достаточно необычно, но все же прекрасно работает и нам сразу видно что за что отвечает и что с чем работает : LPDIRECTINPUT8 p_dinput; - это интерфейс
DirectInput8 с которым мы будем работать, Эти две функции нужны для захвата и освобождения устройств ввода. Некоторые устройства (особенно клавиатуры и мыши) регулярно захватываются и освобождаются приложениями. Обычно они освобождаются автоматически в тот момент, когда приложение теряет фокус. Когда ваше приложение опять получает фокус, оно должно снова захватить устройство. Далее идут конструктор и деструктор. затем еще несколько общих функций int CreateDInput (HINSTANCE); - создает
исходный интерфейс DirectInput8 для нашей последующей работы, Теперь посмотрим внутренности этих функций : Для начала конструктор и деструктор :
csc_DInput::csc_DInput ()
{
_RELEASE_ (keyboard.p_dev);
_RELEASE_ (p_dinput);
keyboard.bUse = false;
keyboard.bActive = false;
};
csc_DInput::~csc_DInput () { };
здесь мы просто инициализируем и обнуляем необходимые нам интерфейсы и переменные. Затем создание и уничтожение DirectInput8 :
int csc_DInput::CreateDInput (HINSTANCE hInst)
{
HRESULT hr;
if(FAILED(hr = DirectInput8Create (hInst,
DIRECTINPUT_VERSION, IID_IDirectInput8,
(void**)&p_dinput, 0))) return hr;
return 0;
};
void csc_DInput::Destroy (void)
{
UnAccure ();
_RELEASE_ (keyboard.p_dev);
_RELEASE_ (p_dinput);
keyboard.bUse = false;
keyboard.bActive = false;
};
в данном отрывке мы создаем интерфейс DirectInput8 одной строкой, а при уничтожении мы сперва освобождаем все устройства и затем освобождаем интерфейсы DirectInput8 предназначенные для работы с этими устройствами. Далее захват и освобождение устройств ввода :
void csc_DInput::Accure (void)
{
if(keyboard.p_dev) keyboard.p_dev->Acquire ();
};
void csc_DInput::UnAccure (void)
{
if(keyboard.p_dev) keyboard.p_dev->Unacquire ();
};
Здесь я просто использовал функции, предназначенные для этих целей. Пока здесь присутствует только клавиатура, но впоследствии мы добавим и мышку и джойстик. И последний общий метод - метод обновления состояний устройств :
void csc_DInput::Update (void)
{
if(keyboard.bUse)
if(keyboard.bActive)
keyboard.Update ();
};
в данном методе мы будем вызывать методы классов соответствующих устройствам. Сначала проверяется используется ли устройство и активно ли оно и затем происходит вызов соответствующего метода.
Еще у нас осталась не рассмотрена функция создания клавиатуры, но для этого нам необходимо сперва рассмотреть соответствующий класс для работы с клавиатурой :
...
class _keyboard
{
friend class csc_DInput;
private:
LPDIRECTINPUTDEVICE8 p_dev;
void Update (void);
bool bActive;
bool bUse;
unsigned char keys[256];
public:
bool IsActive (void) { return bActive; };
bool IsButD (DWORD);
bool IsAnyButD (void);
} keyboard;
...
сперва мы объявляем класс csc_DInput дружественным данному, это нужно для того, чтобы выше содержащий класс имел доступ к приватным членам данного класса. Далее у нас идут : LPDIRECTINPUTDEVICE8 p_dev; - интерфейс
устройства DirectInput8, в данном случае для клавиатуры, bool IsActive (void) { return bActive; }; -
возвращает нам информацию о том, активна ли клавиатура, Теперь мы можем рассмотреть функцию создания клавиатуры :
int csc_DInput::CreateKeyboard (HWND hWnd)
{
HRESULT hr;
if(FAILED(hr = p_dinput->CreateDevice (GUID_SysKeyboard,
&keyboard.p_dev, 0))) return hr;
if(FAILED(hr = keyboard.p_dev->SetDataFormat (&c_dfDIKeyboard))) return hr;
if(FAILED(hr = keyboard.p_dev->SetCooperativeLevel (hWnd,
DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) return hr;
keyboard.bUse = true;
keyboard.bActive = true;
Accure ();
return 0;
};
--- первоначально мы создаем интерфейс
DirectInput8 для работы с клавиатурой, это показано флагом GUID_SysKeyboard
. --- далее мы говорим сами себе, что клавиатуру мы используем, и она активна, и захватываем ее.
После того как мы рассмотрели эту функцию, пришел черед рассмотреть внутренности класса предназначенного для работы с клавиатурой. У нас имеется в данном классе три метода и все они связаны , так или иначе, с обновлением :
void csc_DInput::_keyboard::Update (void)
{
p_dev->GetDeviceState (sizeof(keys), (LPVOID)&keys);
};
bool csc_DInput::_keyboard::IsButD (DWORD index)
{
if(keys[index] & 0x80) return true;
return false;
};
bool csc_DInput::_keyboard::IsAnyButD (void)
{
for(int i=0; i<256; i++)
if(keys[i] & 0x80) return true;
return false;
};
--- в функции обновления состояния мы просто
обновляем состояние :) Вот в принципе и все.
Рассмотрим еще только, как и что у нас поменялось в нашей программе. Я использовал пример из предыдущего урока, и заменил там весь ввод от клавиатуры, который обрабатывался Windows'ом в оконной функции, на ввод который обрабатывается DirectInput8. Для этого я создал отдельную функцию обработки пользовательского ввода :
//-----------------------------------------------------------------------------
// Name: ProcessUserInput ()
// Desc:
//-----------------------------------------------------------------------------
void ProcessUserInput (void)
{
directinput8.Update ();
if(KEYDOWN(DIK_NEXT))
p_d3d_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_WIREFRAME);
if(KEYDOWN(DIK_PRIOR))
p_d3d_Device->SetRenderState (D3DRS_FILLMODE, D3DFILL_SOLID);
if(KEYDOWN(DIK_ADD)) distance--;
if(KEYDOWN(DIK_SUBTRACT)) distance++;
if(KEYDOWN(DIK_INSERT)) effect=0;
if(KEYDOWN(DIK_DELETE)) effect=1;
if(KEYDOWN(DIK_UP))
{
Donut.Move (sin(angel), 0.0f, cos(angel));
Donut.Transform();
};
if(KEYDOWN(DIK_DOWN))
{
Donut.Move (-sin(angel), 0.0f, -cos(angel));
Donut.Transform();
};
if(KEYDOWN(DIK_LEFT))
{
angel+=D3DXToRadian(-5);
Donut.RotateY (D3DXToRadian(-5));
Donut.Transform();
};
if(KEYDOWN(DIK_RIGHT))
{
angel+=D3DXToRadian(5);
Donut.RotateY (D3DXToRadian(5));
Donut.Transform();
};
if(KEYDOWN(DIK_HOME))
{
Donut.Scale (1, 1.1, 1);
Donut.Transform();
};
if(KEYDOWN(DIK_END))
{
Donut.Scale (1, 0.9, 1);
Donut.Transform();
};
};
Вызывать ее нужно перед рендерингом :
while (1)
{
if(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage (&msg, NULL, 0, 0)) break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
else
if(bActive)
{
ProcessUserInput ();
RenderScreen ();
};
};
тут я еще использовал макрос для облегчения читаемости кода : #define KEYDOWN(key) (directinput8.keyboard.IsButD(key)) Вот теперь действительно все. Теперь, попробовав пример из предыдущего урока и из этого, вы почувствуете разницу при работе с клавиатурой :) Рубрика: Direct3D
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|