AdSense

Freitag, 12. Juli 2013

C# - Joystick ansprechen

(English version) Da Konsolen doof sind möchte ich in nächster Zeit versuchen, mehrere Gamepads an einem Windows-PC zum laufen zu bringen, da kommen also eventuell noch einige interessante Posts.

Fürs Erste spreche ich einen Joystick an. Das geht so: Ich benutze das Joystick-Projekt von hier, das ganze wird einfach in ein neues Windows Forms Projekt in eine Klasse Joystick.cs geschmissen (Und Direct X eingebunden, mehr dazu hier). Ich habe das Projekt leicht umgeschrieben: ganz unten public delegate void OnAxeChanged(Int32 X, Int32 Y, Int32 Z, Int32 Rz);, also die Achse Z eingefügt und dann natürlich noch beim Aufruf von AxeChanged: AxeChanged.Invoke(X, Y, Z, Rz);.

Mein restliches Programm (um z.B. die x-Achse auszulesen) sieht dann so aus (man muss natürlich das Joystick-Projekt einbinden):

public partial class Form1 : Form
{
    Joystick.Joystick joystick;
    public Form1()
    {
        InitializeComponent();
        joystick = new Joystick.Joystick(this, true);
        joystick.PushChange += joystick_PushChange;
        joystick.AxeChanged += joystick_AxeChanged;
    }

    void joystick_AxeChanged(int X, int Y, int Z, int Rz)
    {
        System.Console.Write("Axis: {0}\t{1}\t{2}\t{3}\n", X, Y, Z, Rz);
    }

    void joystick_PushChange(int Push)
    {
        System.Console.Write("Push: {0}\n", Push);
    }
}


Damit lassen sich jetzt beliebig viele Sachen anstellen, z.B. Panzerkampf per Joystick steuern. Events gibt es glücklicherweise auch für alles (Tasten, Achsen, etc), also sollte man damit gut arbeiten können.

Falls jemand das fertige Joystick-Projekt haben möchte, kann ich es hochladen, aber eigentlich sollte das erstellen des Projektes trivial sein.

Falls jemand mehrere Joysticks ansprechen will muss er eine von mir aktualisierte Version des Projektes benutzen: JoystickMultiple. Das Grundprinzip ist das gleiche geblieben, man kann das Joystick-Projekt wie bisher benutzen oder aber auch gezielt einzelne Joysticks ansprechen. Das geht dann so:

Dictionary<Guid, string> foundSticks = Joystick.Joystick.GetAllJoysticks();
foreach (KeyValuePair<Guid, string> pair in foundSticks)
{
    Joystick.Joystick localStick = new Joystick.Joystick(this, false, pair.Key);
    System.Console.Write("stick: {0}\n", pair.Value);
    localStick.ButtonDown += joystick_ButtonDown;
}


joystick_ButtonDown sieht bei mir folgendermaßen aus:

void joystick_ButtonDown(int ButtonNumber, Joystick.Joystick stick)
{
    System.Console.Write("{1} - Button: {0}\n", ButtonNumber, stick.Name);
}


Man bekommt in der von mir veränderten Klasse also ganz einfach bei jedem Event den Joystick zurück und kann damit arbeiten. Wie jedoch auch bei DirectSound muss für das DirectInput-Zeug die app.config bearbeitet werden: <startup> muss verändert werden zu <startup useLegacyV2RuntimeActivationPolicy="true">, sonst wird das Programm nicht ausgeführt.

Keine Kommentare:

Kommentar veröffentlichen