본문 바로가기
programing/C++

조이패드(Joypad) Input

by RedWiz 2016. 9. 9.

#include <mmsystem.h>


#pragma comment(lib, "winmm.lib");




JOYINFOEX joyinfo;

memset(&joyinfo, 0, sizeof(JOYINFOEX));

UINT nValid = 0;


joyinfo.dwSize = sizeof(JOYINFOEX);

joyinfo.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNX | JOY_RETURNY;


// 조이스틱이 연결 됐는지 확인

if(joyGetPosEX(JOYSTICKID1, &joyinfo) != JOYERR_UNPLUGGED)

nValid = JOYSTICKID1;

else if(joyGetPosEX(JOYSTICKID1, &joyinfo) != JOYERR_UNPLUGGED)

nValid = JOYSTICKID2;

else

return FALSE;


joySetThreshold(nValid, 100);

// 해당된 조이스틱 ID와 조이스틱이 움직일 거리 설정

// 움직일 거리값이 작을 수록 미세한 움직임에도 반응

// 적당한 값을 넣어주면 됨 너무 커도 잘 안움직임


joySetCapture(hwnd, nValid, 100, TRUE);

// 조이스틱의 메시지를 보낼 윈도우 핸들 설정


윈도우 메시지로 사용시

CALLBACK WndProc() 안에 JoyInit(HWND hwnd) 넣어줌


조이스틱 발생 메시지

MM_JOYnBUTTONDOWN

MM_JOYnBUTTONUP

MM_JOYnMOVE


// 조이스틱 ID를 찾을때 (무식한 방법인듯)

numJoys = joyGetNumDevs();

for (int i = 0; i < numJoys; i++)
{
 if (joyGetPosEx(i, &joyInfo) == JOYERR_NOERROR)
 {
  joyID = i; // JOYSTICKID1 아니면 JOYSTICKID2
  break;
 }
}


JOYCAPS joycap;
WORD joyMid;
WORD joyPid;
MMRESULT mr = joyGetDevCaps(joyID, &joycap, sizeof(JOYCAPS));
WORD joyMid = joycap.wMid;
WORD joyPid = joycap.wPid;


joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji)로 값 확인 가능

pji 구조체 포인터를 통해서 입력값 확인

반환값

JOYERR_NOERROR : 문제 없음
JOYERR_PARMS : uJoyID가 유효하지 않거나 hWnd가 NULL
JOYERR_NOCANDO : 입력을 감지 못함
JOYERR_UNPLUGGED : 안꽂힘



cf. X Input의 경우


- 왼쪽 스틱 : dwXpos & dwYpos

- 오른쪽 스틱 : dwUpos & dwRpos


- 방향키 : dwPOV

중앙 : 65535, 8방향 : 0, 4500, 9000, 13500, 18000, 22500, 27000, 31500


- 왼쪽 트리거(L2) : dwZpos(~65408)

- 오른쪽 트리거(R2) : dwZpos(128~)


- 버튼 : dwButtons  A(아래):1 B(오른):2 X(왼):4 Y(위):8

L1:16, R1:32, SELECT:64, START:128, L3:256, R3:512


cf. P3의 경우


- 왼쪽 스틱 : dwXpos & dwYpos

- 오른쪽 스틱 : dwZpos & dwRpos


- 방향키 : dwPOV

중앙 : 65535, 8방향 : 0, 4500, 9000, 13500, 18000, 22500, 27000, 31500


- 왼쪽 트리거(L2) : 64

- 오른쪽 트리거(R2) : 128


- 버튼 : dwButtons  A(아래):1 B(오른):2 X(왼):4 Y(위):8

L1:16, R1:32, SELECT:256, START:512, L3:1024, R3:2048



cf. https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757121(v=vs.85).aspx


'programing > C++' 카테고리의 다른 글

extern과 static  (0) 2016.10.09
코드 최적화  (0) 2016.09.20
[Modern C++] 스마트 포인터  (0) 2016.08.16
[Modern C++] std::array  (0) 2016.08.16
[Modern C++] 유니폼 초기화(vector)  (0) 2016.08.16