Prise en charge d'un joystick avec C#.NET

j'ai cherché ça sur Google, mais les seules choses que j'ai trouvées étaient dépassées et ne fonctionnaient pas.

quelqu'un a une information sur comment obtenir un joystick de données à l'aide de C# .NET?

17
demandé sur Arseny 2010-10-14 07:00:38

4 réponses

: utilisation de SlimDX.

deux: il ressemble à ceci (où GamepadDevice est mon propre wrapper, et le code est réduit à juste les parties pertinentes).

Trouver le joystick / pad Guid:

    public virtual IList<GamepadDevice> Available()
    {
        IList<GamepadDevice> result = new List<GamepadDevice>();
        DirectInput dinput = new DirectInput();
        foreach (DeviceInstance di in dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly))
        {
            GamepadDevice dev = new GamepadDevice();
            dev.Guid = di.InstanceGuid;
            dev.Name = di.InstanceName;
            result.Add(dev);
        }
        return result;
    }

une fois que l'Utilisateur a sélectionné dans la liste, acquiers le gamepad:

   private void acquire(System.Windows.Forms.Form parent)
    {
        DirectInput dinput = new DirectInput();

        pad = new Joystick(dinput, this.Device.Guid);
        foreach (DeviceObjectInstance doi in pad.GetObjects(ObjectDeviceType.Axis))
        {
            pad.GetObjectPropertiesById((int)doi.ObjectType).SetRange(-5000, 5000);
        }

        pad.Properties.AxisMode = DeviceAxisMode.Absolute;
        pad.SetCooperativeLevel(parent, (CooperativeLevel.Nonexclusive | CooperativeLevel.Background));
        pad.Acquire();
    }

Interrogation de la tablette ressemble à ceci:

        JoystickState state = new JoystickState();

        if (pad.Poll().IsFailure)
        {
            result.Disconnect = true;
            return result;
        }

        if (pad.GetCurrentState(ref state).IsFailure)
        {
            result.Disconnect = true;
            return result;
        }

        result.X = state.X / 5000.0f;
        result.Y = state.Y / 5000.0f;
        int ispressed = 0;
        bool[] buttons = state.GetButtons();
13
répondu Adrian Cox 2011-03-09 15:50:24

comme c'était le hit haut que j'ai obtenu sur google tout en recherchant l'entrée de joystick / gamepad dans C#, j'ai pensé que je devrais poster une réponse pour que les autres voient.

la façon la plus facile que j'ai trouvée était D'utiliser SharpDX et DirectInput. Vous pouvez l'installer via NuGet (SharpDX.DirectInput)

après cela, il s'agit simplement d'appeler quelques méthodes:

exemple de code de SharpDX

static void Main()
{
    // Initialize DirectInput
    var directInput = new DirectInput();

    // Find a Joystick Guid
    var joystickGuid = Guid.Empty;

    foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, 
                DeviceEnumerationFlags.AllDevices))
        joystickGuid = deviceInstance.InstanceGuid;

    // If Gamepad not found, look for a Joystick
    if (joystickGuid == Guid.Empty)
        foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, 
                DeviceEnumerationFlags.AllDevices))
            joystickGuid = deviceInstance.InstanceGuid;

    // If Joystick not found, throws an error
    if (joystickGuid == Guid.Empty)
    {
        Console.WriteLine("No joystick/Gamepad found.");
        Console.ReadKey();
        Environment.Exit(1);
    }

    // Instantiate the joystick
    var joystick = new Joystick(directInput, joystickGuid);

    Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid);

    // Query all suported ForceFeedback effects
    var allEffects = joystick.GetEffects();
    foreach (var effectInfo in allEffects)
        Console.WriteLine("Effect available {0}", effectInfo.Name);

    // Set BufferSize in order to use buffered data.
    joystick.Properties.BufferSize = 128;

    // Acquire the joystick
    joystick.Acquire();

    // Poll events from joystick
    while (true)
    {
        joystick.Poll();
        var datas = joystick.GetBufferedData();
        foreach (var state in datas)
            Console.WriteLine(state);
    }
}

j'espère que cette aide.

j'ai même eu ce travailler avec un DualShock3 et les MotioninJoy drivers.

25
répondu Valdemar 2012-12-05 23:58:50

la mauvaise nouvelle est que Microsoft semble arrêter de soutenir leurs bibliothèques NET pour DirectX et se concentrer sur XNA à la place. Je ne travaille pas dans GameDev donc je n'ai pas besoin d'utiliser XNA, mais vous pouvez l'essayer si vous développez des jeux informatiques. La bonne nouvelle est qu'il existe d'autres approches. L'un est SlimDX nouveau cadre pour vous aider à wok avec DirectX à partir de C#. L'autre façon est d'ajouter directement des références de "Microsoft.DirectX.dll" et " Microsoft.DirectX.DirectInput.dll" à votre projet. vous peut les trouver "..\Windows\Microsoft.NET\DirectX pour le Code Managé\". si vous allez utiliser la dernière approche voici un lien pour codeproject où lire comment travailler avec un joystick.

EDIT: Si votre application est basée sur la version NET plus récente puis 2.0 l'application peut s'accrocher. Pour corriger ce problème, changez le fichier de configuration et ajoutez ceci:

<startup useLegacyV2RuntimeActivationPolicy="true"> 
3
répondu Arseny 2011-03-09 15:40:07

Google m'a mené ici et bien que ce ne soit pas une exigence de cette question, OpenTK est une bonne option pour Windows et Linux (sous mono).

OpenTK docs, ce code fonctionne sur Raspberry Pi + Raspbian + Mono 3.12.0:

for (int i = 0; i < 4; i++)
{
    var state = Joystick.GetState(i);
    if (state.IsConnected)
    {
        float x = state.GetAxis(JoystickAxis.Axis0);
        float y = state.GetAxis(JoystickAxis.Axis1);

        // Print the current state of the joystick
        Console.WriteLine(state);
    }
}
0
répondu fiat 2015-02-14 10:05:04