본문 바로가기

TechLog

조이패드를 마우스로 사용하기

:: 소스 코드 다운로드


조이패드를
마우스로 사용하기

저는 요즘 JAM(Joypad As Mouse)라는 프로그램을 만들고 있습니다. 이것은 조이패드, 조이스틱 등의 입력 기구를 이용해 마우스 기능을 사용할 수 있게 해주는, 말하자면 결국 DirectX 기능을 포장한 간단한 Wrapper 클래스입니다. 이 소스를 공개해보도록 하겠습니다.

 

 

안녕하세요 : ) 오래간만의 아티클입니다.

 

정신 없이 바쁜 와중이라 연재를 할 여력은 없고..;

평소에 심심할 때 조금씩 만들고 있던 간단한 코드를 공개해볼까 합니다.

 

최대한 간단하게 설명하자면 조이패드로 마우스 기능을 하도록 만드는 프로그램이구요, DirectX DirectInput을 사용해서 조이패드의 입력을 받고, 그 입력을 가지고 가상의 마우스 이벤트를 발생시킵니다.

 

JAM(Joypad As Mouse)라는 이름을 붙여놓고 만들고 있고, 기본 구조는 얼렁뚱땅 대충 나와있는 상태입니다. 소스코드를 직접 보시는게 빠르실 듯..

 

이 예제는 VS.net 2003, DirectX 9.0 SDK(December 2004)가 설치된 환경에서 작성되었습니다.

 

그럼 시작합니다 : )

 

 

DirectX in C#, MDX

 

MDX(Managed DirectX)는 닷넷의 Managed Code 환경 하에서 DirectX에 접근 가능한 기능을 제공하는 라이브러리이며, DirectX 9.0 이상에서 지원돤다. JAM 또한 MDX를 사용해서 만들어졌으므로 이 소스 코드를 실행하기 위해서는 DirectX 9.0 SDK를 설치해야 한다.

 

   

    메뉴의 '도움말' -> 'Microsoft C#.net 정보'를 보면 MDX가 설치된 것을 확인할 수 있다.

 

DirectX가 설치된 것을 확인한 후, 다음과 같이 참조를 추가하면 MDX를 사용할 수 있게 된다 : (여기서는 DirectX DirectInput만을 사용하므로, 다음과 같이 두 개의 .Net 구성 요소를 추가한다)

   

 

프로젝트에서 위와 같이 세팅했다면, 닷넷에서 DirectX를 사용할 준비는 끝난 것이다. 간단하지 않은가?

 

 

JAMDevice 클래스

 

실 질적으로 DirectInput 관련 함수를 호출해서, 조이패드(혹은 조이스틱) 입력을 받아들이는 클래스이다. 초기화에 관련된 부분은 코드를 읽으면 쉽게 이해할 수 있을 것이고, 사실 이해할 수 없다고 해도 DirectInput을 다루게 된다면 계속 보게 될 코드이므로 소스만 어디엔가 갖고 있으면 되겠다. (Kenial DirectX SDK의 샘플의 코드에서 발췌했다)

 

InitDirectInput() 호출이 성공하면 조이패드의 입력을 검사하는 스레드가 생성되어 동작하게 된다. 이 스레드의 프로시저가 procDeviceInput()이며, 조이패드의 입력이 검출되면 MouseProcClass를 이용해 마우스 이벤트를 발생시킨다.

 

// 마우스 버튼 관련 처리

buttonsstate = state.GetButtons();

for(i=0;i<JAMDevice.MAX_BUTTONS;i++)

{

    if(oldbuttonsstate[i] != buttonsstate[i])

    {

        MouseProcClass.PressMouseButton(i, buttonsstate[i]!=0);

        oldbuttonsstate[i] = buttonsstate[i];

    }

}

    ) 조이패드 입력을 MouseProcClass PressMouseButton 메서드에 넘겨주어 마우스 버튼 관련 이벤트를 일으키는 코드

 

 

MouseProcClass 클래스

 

마 우스 관련 이벤트를 일으키는 메서드들을 구현한 클래스이다. 원래 의도는 PostMessage() API를 사용하는 것이었으나, 편의상 mouse_event()로 대체하여 사용하게 되었다. 현재에는 마우스의 움직임, 왼쪽/오른쪽/휠 클릭, 휠 회전 등을 감지할 수 있게 만들어져 있다.

 

public static void MoveBy(int x, int y, int acc)

{

    int xx = System.Windows.Forms.Cursor.Position.X;

    int yy = System.Windows.Forms.Cursor.Position.Y;

    int unit = 100-acc;

    if(unit <= 20)

        unit = 20;

    xx += x/(unit);

    yy += y/(unit);

    

    SetCursorPos(xx, yy);

    Debug.WriteLine(string.Format("MoveBy : {0} {1}", x, y));

}

    ) 마우스의 움직임 이벤트를 생성하는 메서드의 코드

 

   

    프로그램의 실행 화면 (조이패드의 움직임 추적 중)

 

 

정리

 

   

    Kenial의 개조된 X-box 패드

 

Kenial 이 이 프로그램(이라고 부르기엔 아직 미흡하지만)을 만들게 된 동기는 단순하게도, 게임 에뮬레이터의 실행 화면에서 조이패드로 게임을 고를 수 있는 기능이 제공되지 않아 '차라리 조이패드로 마우스 기능을 하게 하자'라는 생각에서였습니다.

 

   

    Kenial JAM을 만들게 된 동기와 별 관련이 많은 프로그램

 

하도 오래간만이라 가벼운 코드로 다시 시작해 봤습니다. 혹시라도 MDX에 입문하셔야겠다는 분에게 좋은 예제가 되었으면 하네요 : )

 

그럼 : )