Introducción a DirectInput con C#

El dispositivo joystick

Respecto al joystick no podremos escapar a la obtención del Guid correspondiente al joystick a consultar para poder crear el objeto del tipo Device. El Guid lo obtendremos por medio de la clase Manager, como vimos al comienzo de la nota, una vez hecho esto los pasos siguientes son similares al teclado y al mouse:


| device = new Device(guidJoystick);
| device.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
| device.Acquire();

Es posible fijar ciertas propiedades al joystick antes comenzar a realizar consultas sobre el mismo. Usualmente las propiedades suelen fijarse después de crear el objeto pero antes de invocar el método Acquire, sin embargo para fijar el rango de los ejes, como haremos a continuación, esto es indistinto:


| foreach(DeviceObjectInstance doi in device.Objects)
| {
| if ((doi.ObjectId & (int)DeviceObjectTypeFlags.Axis) != 0)
| // Fijamos el rango del eje
| device.Properties.SetRange(ParameterHow.ById, doi.ObjectId, new InputRange(-MAX_RANGE_AXIS, MAX_RANGE_AXIS));
| }

En el listado anterior invocamos el método SetRange para cada objeto retornado por la propiedad Objects del objeto device. La idea aquí es fijar el número máximo que nos retornará la consulta de los ejes del joystick cuando el mismo se encuentre de fijado hacia un extremo, en nuestro caso especificamos +/- un valor constante, de modo que cuando el valor retornado sea cero sabremos que el joystick se encuentra en reposo. También por medio del método SetDeadZone podríamos especificar una zona muerta del joystick, es decir un rango de valores para los cuales si el valor de alguno de los ejes se encuentra dentro, el valor de retorno sea cero (de este modo podríamos disminuir un poco la sensibilidad del joystick en sitios cercanos al reposo).

Para obtener el estado del joystick invocaremos el método CurrentJoystickState del objeto device que nos retornará un objeto del tipo JoystickState. Un joystick puede tener varios ejes (usualmente al menos dos), varios sliders y muchos botones (se soportan hasta 128 botones).

Veamos como utilizar las propiedades más comunes del objeto JoystickState:

Obtenemos el estado del joystick:


| JoystickState state = device.CurrentJoystickState;

Mostramos el valor de los ejes X e Y:
grpPointer.Text = string.Format(“x={0} y={1}”, state.X, state.Y);

Obtenemos el array de estado de botones:


| byte[] buttons = state.GetButtons();

En función del estado del primer botón cambiamos de color el fondo de un Label:


| if (buttons[0] == 0)
| lblButton1.BackColor = System.Drawing.Color.LightGreen;
| else
| lblButton1.BackColor = System.Drawing.Color.Red;

Consideraciones generales

Siempre es importante tomar alguna acción si es que, por ejemplo, el dispositivo no puede crearse. Para esto es conveniente colocar al “new Device(…” dentro de un bloque try…catch o verificar que el objeto retornar sea distinto a null. Si el Guid pasado como parámetro no es válido, DirectInput arroja una excepción del tipo Microsoft.DirectX.DirectInput.InputException. En el código de ejemplo, no colocamos los bloques try…catch con el fin de mantener el código lo más breve y simple posible.

Conclusiones

Hemos cubierto la parte básica del manejo de dispositivos de entrada con DirectInput, espero que esta introducción sea útil para quienes desean crear aplicaciones tal vez no muy convencionales. Aspectos que invito al lector profundizar, es el manejo del force feedback de los joysticks, el force feedback se maneja como un dispositivo separado (a pesar de estar dentro del mismo perisférico) y posee la particularidad de no ser realmente un dispositivo de entrada sino uno de salida, ya que realmente nosotros no lo consultaremos sino que modificaremos su estado.

Para descargar la aplicación de ejemplo, puede hacer click aquí.

~fuzzyLogic

Compartir:
  • Twitter
  • Facebook
  • MySpace
  • BarraPunto
  • del.icio.us

Pages: 1 2 3 4 5

No comments yet. Be the first.

Leave a reply