2016-08-23 2 views
0

Xbox 360 컨트롤러를 C#에서 사용하기위한 정보가 이미 많이 있지만 X 박스 한 컨트롤러에 대한 정보가 많지 않습니다.C# 응용 프로그램에서 xbox 하나의 컨트롤러를 사용하는 방법

나는 아주 기본적인 조작, 특히 조이스틱과 트리거 값이 필요합니다.

온라인 정보의 대부분은 C++ 응용 프로그램 용이지만 사용자 지정 라이브러리를 작성하는 대신 SharpDX과 같은 것을 사용하고 싶습니다. 신청서에 이것을 어떻게 사용합니까?

참고 : 내가 발견 한 정보를 공유하고 내 결과를 문서화하기 위해 게시하고 있습니다. NET 응용 프로그램에 컨트롤러 입력을 가져 오는 다른 방법을 듣고 싶습니다.

답변

5

내가 시작한 가장 쉬운 방법은 SharpDX를 사용하는 것이 었습니다. SharpDX website :

SharpDX는 DirectX API의 오픈 소스 관리 .NET 랩퍼입니다.

SharpDX is available on nuget이므로 Visual Studio에서 시작하는 것이 매우 간단합니다.

Visual Studio에서 Tools -> NuGet Package Manager -> Package Manager Console (2015 커뮤니티 에디션 사용)으로 이동하십시오.

Adding sharpdx with package manager inside VS2015

그럼 간단하게 입력 : Install-Package SharpDX를 비주얼 스튜디오의 하단에 표시되는 패키지 관리자 콘솔에.

Install SharpDX

비주얼 스튜디오 다운로드하고 솔루션에 추가합니다. 이제 코드를 살펴보십시오.

xbox 컨트롤러에서 입력을 원했기 때문에 프로그램 상단에
using SharpDX.XInput을 추가하면됩니다.

그리고 모든 값을 얻을 수있는 코드는 매우 간단하다 : 컨트롤러의 조이스틱은 결코 완전히 제로로 돌아 없기 때문에

class XInputController 
{ 
    Controller controller; 
    Gamepad gamepad; 
    public bool connected = false; 
    public int deadband = 2500; 
    public Point leftThumb, rightThumb = new Point(0,0); 
    public float leftTrigger, rightTrigger; 

    public XInputController() 
    { 
     controller = new Controller(UserIndex.One); 
     connected = controller.IsConnected; 
    } 

    // Call this method to update all class values 
    public void Update() 
    { 
     if(!connected) 
      return; 

     gamepad = controller.GetState().Gamepad; 

     leftThumb.x = (Math.Abs((float)gamepad.LeftThumbX) < deadband) ? 0 : (float)gamepad.LeftThumbX/short.MinValue * -100; 
     leftThumb.y = (Math.Abs((float)gamepad.LeftThumbY) < deadband) ? 0 : (float)gamepad.LeftThumbY/short.MaxValue * 100; 
     rightThumb.y = (Math.Abs((float)gamepad.RightThumbX) < deadband) ? 0 : (float)gamepad.RightThumbX/short.MaxValue * 100; 
     rightThumb.x = (Math.Abs((float)gamepad.RightThumbY) < deadband) ? 0 : (float)gamepad.RightThumbY/short.MaxValue * 100; 

     leftTrigger = gamepad.LeftTrigger; 
     rightTrigger = gamepad.RightTrigger; 
    } 
} 

이것은 데드 밴드를 만듭니다. 또한 두 스틱 입력이 일치하도록 왼쪽 X 축을 반전시킵니다. Y의 양이 X 양이 오른쪽에, 최대입니다 :

leftThumb.x = (Math.Abs((float)gamepad.LeftThumbX) < deadband) ? 0 : (float)gamepad.LeftThumbX/short.MinValue * -100; 
leftThumb.y = (Math.Abs((float)gamepad.LeftThumbY) < deadband) ? 0 : (float)gamepad.LeftThumbY/short.MaxValue * 100; 
rightThumb.y = (Math.Abs((float)gamepad.RightThumbX) < deadband) ? 0 : (float)gamepad.RightThumbX/short.MaxValue * 100; 
rightThumb.x = (Math.Abs((float)gamepad.RightThumbY) < deadband) ? 0 : (float)gamepad.RightThumbY/short.MaxValue * 100; 

는 희망이 자신의 .NET 응용 프로그램에 X 박스 하나의 컨트롤러 입력을 추가하고자하는 미래의 누군가에게 도움이 될 것입니다!

+1

+1 가벼운 대안은 https://github.com/speps/XInputDotNet이며, 데드 존 (deadzones)은 https://msdn.microsoft.com/en-us/library/windows/desktop/ 대신 데드 존을 사용하는 것이 좋습니다. ee417001 (v = vs.85) .aspx # dead_zone – Aybe

+0

추가 정보 주셔서 감사합니다! @ 아마 XInputDotNet을 살펴 봐야 할 것입니다! 최대 폴링시 매 2 초마다 가비지 수집기를 시작했기 때문에 컨트롤러에 대한 폴링 속도를 약 100mhz (지연 시간 10ms)로 줄여야했습니다. 10ms 폴링 율에서 눈에 띄는 차이는 없습니다. –

+0

당신을 환영합니다 !!! – Aybe