Tomando entrada de un joystick con C # .NET

Busqué en Google esto, pero las únicas cosas que surgieron fueron obsoletas y no funcionaron.

¿Alguien tiene información sobre cómo obtener datos de joystick usando C # .NET?

Uno: use SlimDX .

Dos: se ve algo como esto (donde GamepadDevice es mi propio envoltorio, y el código se reduce a solo las partes relevantes).

Encuentra los GUID de joystick / pad:

  public virtual IList Available() { IList result = new List(); 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; } 

Una vez que el usuario ha seleccionado de la lista, adquiere el 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(); } 

El sondeo del pad se ve así:

  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(); 

Dado que este fue el éxito principal que obtuve en google mientras investigaba la entrada de joystick / gamepad en C #, pensé que debería publicar una respuesta para que otros la vean.

La forma más fácil que encontré fue usar SharpDX y DirectInput. Puede instalarlo a través de NuGet (SharpDX.DirectInput)

Después de eso, es simplemente una cuestión de llamar a algunos métodos:

Código de muestra 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); } } 

Espero que esto ayude.

Incluso tengo esto para trabajar con un DualShock3 y los controladores MotioninJoy.

La mala noticia es que Microsoft parece dejar de apoyar sus bibliotecas NET para DirectX y centrarse en XNA. No trabajo en GameDev, así que no necesito usar XNA pero puedes probarlo si desarrollas juegos de computadora. La buena noticia es que hay otros enfoques. Uno de ellos es SlimDX, el nuevo framework que le ayudará a trabajar con DirectX desde C #. La otra forma es agregar directamente las referencias de “Microsoft.DirectX.dll” y “Microsoft.DirectX.DirectInput.dll” a su proyecto. puede encontrarlos “.. \ Windows \ Microsoft.NET \ DirectX para Managed Code \”. si va a utilizar el último enfoque aquí hay un enlace al proyecto de código donde puede leer cómo trabajar con un joystick.

EDITAR: si su aplicación está basada en una versión NET más nueva que la 2.0, la aplicación puede esperar. Para solucionar este problema, cambie el archivo de configuración y agregue esto:

  

Google me guió hasta aquí y aunque no es un requisito de esta pregunta, OpenTK es una buena opción para Windows y Linux (bajo soporte mono).

Desde los documentos de OpenTK , este código funciona en 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); } }