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 // 오른쪽 트리거