본문 바로가기

Developement/C/C++

MinGW-W64 용 DirectInput 소스 (키보드,마우스,조이스틱)



 MinGW-w64 프로젝트 부터 DirectX 관련 SDK 가 포함 되어 있으므로 윈도우 어플 개발에 매우 편리함을 얻을 수 있습니다만, MFC 처럼 뭔가 꽁꽁 묶여져 있는거 찾기가 사실 어렵다 보니 직접 만들어 써야 하는게 많은건 사실 입니다. 대신 쾌적함을  얻을 수 있는건 덤 이지만 ...

 그래서 제가 진행 중인 프로젝트 중에 DirectX 의 2D, input 을 가져다 쓰면서 좀 더 편리하게 써 보고자 만들었던 것을 공유 하고자 합니다.


 사용은 간단 합니다.

 먼저 현재 사용되는 윈도우에 생성 부분 쪽에 InitDirectInput() 를 사용하여 Dinput 을 초기화 합니다. 이떄 반환되는 값은 HRESULT 가 아니라 DXINPUT_INIT_RESULT_KEYBOARD, DXINPUT_INIT_RESULT_MOUSE, DXINPUT_INIT_RESULT_JOYSTICK 또는 DXINPUT_INIT_RESULT_ALL 이 넘어 오는데, 연결된 PC 에 조이스틱이나 마우스, 키보드 등이 하나 빠지면 해당 값들이 OR 연산 되어 넘어 옵니다. 보통 조이스틱 없으니 넘어 오는 값은 실제 DXINPUT_INIT_RESULT_KEYBOARD | DXINPUT_INIT_RESULT_MOUSE 값, 즉 1+2 = 3 이 넘어 오게 됩니다. 만약 다 연결 되어 있으면 DXINPUT_INIT_RESULT_ALL = 7 이 넘어 오고, 제대로 인지가 안되면 DXINPUT_INIT_RESULT_NONE = 0 이 넘어 옵니다.

 만약 현재 연결 된 기기에 Xinput 을 쓰는 조이스틱이 있다면, 인자값 중 isxinput 에 true 를 넣어서 초기화 하시기 바랍니다. 실제 xinput 이 가지는 장점이 뭔지는 아직 잘 몰라서 사용은 안 하고 있지만, MSDN 에 있는 그대로 넣어서 만들었습니다.


이제 실제 사용은, 입력 처리 하는 thread 부분에서 다음 차례로 처리 합니다.


⁄⁄ ---------------------------------------------------------------------
⁄⁄ Keyboard !
HRESULT hr = UpdateInputStateKeyboard();

if ( hr == S_OK )
{
	KEYSTATE dxKeys;

	GetKeyboardState( &dxKeys );

}


간단 합니다.

키보드만 예를 든 것이지만, 마우스, 조이스틱 모두 동일 합니다.

키보드의 경우는 좀 더 특인 한 점은, 기존의 키맵 256 키를 다 넘겨 받는 것이 아니라, KEYSTATE 구조체에 length 가 있고, keys[] 배열에 실제 눌렸던 키만 들어 가 있습니다. 그래서 length 만큼만 돌면서 keys[] 를 확인 하면 되며, keys[] 안에 들어 가 있는 키 값 ( DIK_xxx 에 해당 ) 이 pressed 와 동일 한 것 입니다.


* 주의 *

 이 소스는 MSDN 에 있는 자료를 보고 MinGW-w64 에 맞게 수정 한 것 으로, 오히려 MFC 에서는 구동이 안될 수 있습니다.


사용하실 분은 아래 소스를 내려 받아 사용하시기 바라며, 포함된 dinputd.h 는 JEDI 프로젝트에서 DirectX8 용 을 포함 한 것임을 먼저 밝힙니다. (MinGW-w64 프로젝트에 누락 되어 있음)


dxinput_mingw_src_1.zip


본 소스 코드는 공개이며, 사용하시는 분의 편의 대로 수정 및 재 배포가 가능하나, 이에 따라 해당 소스로 인해 책임 여부는 배포한 제가 가지지 않음을 미리 밝힙니다.