XBox 360 Controller in C# per SharpDX ansprechen

Im Zuge des Steam Winter Sale habe ich mich mit ein paar kleinen Gelegenheitsspielen für das kommende Jahr eingedeckt. Viel Zeit dafür ist zwar neben Arbeit und Studium nicht mehr, die ein oder andere Viertelstunde lässt sich dafür aber gerne entbehren. Neben den Spielen habe ich mir auch einen XBox 360 Controller für den PC bestellt. Der PC ist nämlich sowieso schon per Hdmi mit dem Fernseher verbunden. Zusammen mit dem Controller und Steam wird daraus dann eine kleine, leistungsstarke Console. Was mich aber neben dem Spielen selbst auch noch interessiert hat, ist, wie man den Controller auch für andere Sachen nutzen kann. Kurzerhand habe ich mir die XInput Schnittstelle angeschaut, mit der der Controller angesprochen werden kann.. und bin überrascht, wie einfach diese gestrickt ist.

XInput ist eine Schnittstelle von DirectX, um Controller anzubinden. In C# kann diese Schnittstelle z. B. über SharpDX verwendet werden. Der Umfang der API ist sehr einfach. Es gibt eine Controller-Klasse und entsprechende Abfrage-Methoden, mit denen der Status der Controller abgefragt werden kann. Es gibt keine Ereignisse, sprich, die Schnittstelle baut rein auf Polling auf. Was ich sehr gut finde: Man braucht sich nicht um die Verbindung zum Controller kümmern. Man bekommt das Flag IsConnected, welches je nach Status der Verbindung zwischen true und false wechselt. Das ist alles. Nach etwa 10 Minuten kam bei mir das Programm aus folgendem Screenshot raus.

Test-Programm in WPF

Das Programm fragt die Daten der angeschlossenen Controller in 100-Millisekunden-Intervallen ab und schreibt die Daten direkt in die Oberfläche. Absolut primitiv also. Das Coding ist auch sehr einfach. Im ersten Schritt wird für jeden möglichen Controller ein ViewModel-Objekt wie folgt angelegt.

m_controllers = new List<ControllerViewModel>();
m_controllers.Add(new ControllerViewModel(new XI.Controller(XI.UserIndex.One)));
m_controllers.Add(new ControllerViewModel(new XI.Controller(XI.UserIndex.Two)));
m_controllers.Add(new ControllerViewModel(new XI.Controller(XI.UserIndex.Three)));
m_controllers.Add(new ControllerViewModel(new XI.Controller(XI.UserIndex.Four)));

XI steht hier übrigens für den Namensraum SharpDX.XInput. Wer schon andere Programme von mir gesehen hat, weiß, dass ich Namensräume vor allem von SharpDX gerne auf die Art per using überschreibe. Wichtigster API-Aufruf hier ist das Anlegen der Controller-Objekte. Dabei ist hier völlig egal, ob die Controller verbunden sind oder nicht. Wie bereits geschrieben, die Verbindung wird im Hintergrund automatisch behandelt. In der ViewModel-Klasse selbst wird dann im Wesentlichen nur noch folgendes gemacht.

...

// Get current state from the controller
m_controller.GetState(out m_state);

...

public string UserIndex
{
    get { return m_controller.UserIndex.ToString(); }
}

public bool IsConnected
{
    get { return m_controller.IsConnected; }
}

public string Buttons
{
    get { return m_state.Gamepad.Buttons.ToString(); }
}

public short LeftThumbX
{
    get { return m_state.Gamepad.LeftThumbX; }
}

public short LeftThumbY
{
    get { return m_state.Gamepad.LeftThumbY; }
}

public byte LeftTrigger
{
    get { return m_state.Gamepad.LeftTrigger; }
}

public short RightThumbX
{
    get { return m_state.Gamepad.RightThumbX; }
}

public short RightThumbY
{
    get { return m_state.Gamepad.RightThumbY; }
}

public byte RightTrigger
{
    get { return m_state.Gamepad.RightTrigger; }
}

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.