:: 소스 코드 다운로드
조이패드를 마우스로 사용하기
저는 요즘 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에 입문하셔야겠다는 분에게 좋은 예제가 되었으면 하네요 : )
그럼 : )
'TechLog' 카테고리의 다른 글
ASP.net 2.0 - 1 ; 개발환경 둘러보기 (0) | 2009.01.17 |
---|---|
Reader 객체에서 인덱스/필드 이름으로 필드 값을 가져올 때의 속도 비교 (0) | 2009.01.02 |
Windows Form에서 특정 부분만 투명하게 만들기 (0) | 2008.12.03 |
아이팟 터치, 아이폰을 외장 디스크로 사용하기 (0) | 2008.11.27 |
맥과 윈도우의 외장하드 공유 (0) | 2008.11.26 |