2009년 11월 7일 토요일

Visual C++에서 Xbox360 컨트롤러 제어하기

Visual C++에서 Xbox360 컨트롤러를 제어하기 위해서는 DirectX SDK 가 필요합니다.

DirectX SDK는 아래 링크에서 다운받을 수 있습니다.


XBox 컨트롤러를 사용하기 위해서는 xinput.h 파일을 인클루드 하고, xinput.lib 라이브러리를 추가해줘야 합니다. Win32 DLL 을 만들기 위해서라면 windows.h 도 포함시켜야 합니다.

#include <xinput.h>
#pragma comment(lib, "xinput.lib")

그 이후 아래 코드와 같이 사용할 수 있습니다.
컨트롤러 제어를 해야 하니 아래 코드는 스레드로 만드는게 좋겠습니다.

XINPUT_STATE state;
ZeroMemory(&state, sizeof(XINPUT_STATE)); // 컨트롤러 상태 초기화
DWORD result = XInputGetState(0, &state); // 컨트롤러 상태 얻어오기

while (result == ERROR_SUCCESS) {
// 컨트롤러 제어 코드가 들어가야 함

Sleep(30); // CPU 점유을 100%를 방지하기 위해
result = XInputGetState(0, &state); // 다음 상태 얻어오기
}

컨트롤러 제어 코드는 버튼제어, 진동제어, 스틱제어, 트리거 제어로 아래와 같이 구현할 수 있습니다.

버튼제어는 다음과 같은 방식으로 해결할 수 있습니다.

if (state.Gamepad.wButtons & XINPUT_GAMEPAD_X) {
// X 버튼이 눌렸을때 할 일
}

xinput.h에 정의된 버튼의 상태를 나타내는 매크로는 다음과 같습니다.

#define XINPUT_GAMEPAD_DPAD_UP          0x0001
#define XINPUT_GAMEPAD_DPAD_DOWN        0x0002
#define XINPUT_GAMEPAD_DPAD_LEFT        0x0004
#define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008
#define XINPUT_GAMEPAD_START            0x0010
#define XINPUT_GAMEPAD_BACK             0x0020
#define XINPUT_GAMEPAD_LEFT_THUMB       0x0040
#define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080
#define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100
#define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200
#define XINPUT_GAMEPAD_A                0x1000
#define XINPUT_GAMEPAD_B                0x2000
#define XINPUT_GAMEPAD_X                0x4000
#define XINPUT_GAMEPAD_Y                0x8000

진동은 다음 코드로 제어할 수 있습니다.

XINPUT_VIBRATION vibration;
ZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));
vibration.wLeftMotorSpeed = 65535; // 0 ~ 65535 사이의 수
vibration.wRightMotorSpeed = 0; // 0 ~ 65535 사이의 수
XInputSetState(0, &vibration);

아날로그 스틱의 값은 다음변수에 저장되어 있습니다.

state.Gamepad.sThumbLX // 왼쪽 아날로그 스틱 X축
state.Gamepad.sThumbLY // 왼쪽 아날로그 스틱 Y축
state.Gamepad.sThumbRX // 오른쪽 아날로그 스틱 X축
state.Gamepad.sThumbRY // 오른쪽 아날로그 스틱 Y축

트리거에 해당하는 값은 다음 변수에 저장되어 있습니다.

state.Gamepad.bLeftTrigger // 왼쪽 트리거
state.Gamepad.bRightTrigger // 오른쪽 트리거

댓글 없음:

댓글 쓰기