Revistas en papel
 Amiga World Nº13 - Septiembre 1990
Anterior
MenĂº
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

JOYSTICK EN C Amiga World

Por David T. McClellan

Para el control de los juegos, ya sean de vuelo, de lucha, o aquellos que precisan una mayor agilidad y control de movimiento, el Joystick ha sido siempre el medio adecuado para los programadores de C, el Joystick es sin embargo un pequeño problema a resolver.

Los programas se comunican con el ratón y con el Joystick a través del Gameport.device, un handler que lee el estado del botón en el joystick (o en el ratón) y envía la información a su programa. Para comunicarse con el Gameport.device, usted deberá primero crear un puerto de mensajes y una estructura IOStdReq, para poder abrir el periférico. Observe el siguiente fragmento de código, el cual deberá ser emplazado después de las especificaciones Include. (Necesitará exec/type.h, exec/device.h, exec/io.h, devices/gameport.h y devices/inputevent.h).

   #define BPT 1 /* selecciona segundo puerto */
   /* el puerto del ratón es el 0 */
   struct MsgPort *joyport;
   struct IOstdReq *joymsg;
   /* otras declaraciones deben situarse aquí */
   if ((joyport=CreatePort (NULL,0))==NULL
   /* código para mostrar un error */
   else if ((joymsg = CreateStdio (joyport))==NULL)
   /* código para mostrar otro error */
   else if (OpenDevice ("gameport.device",BPT,joymsg,0)!=0
   /* código para mostrar el último error */

Esta rutina abre el gameport.device, e inicializa joyport y joymsg como canales de comunicación entre el programa y el periférico. Mientras la anterior rutina abre el periférico, utilizando el puerto trasero, también puede informar sobre sucesos en otros puertos. Si usted abre el puerto frontal, mientras Intuition o el teclado están activos, también se informará de todos los demás sucesos.

Después de haber abierto el periférico en cuestión, debe informar al gameport.device si se está utilizando un ratón o un joystick. Si usa un Joystick, debe especificar el formato de mensaje que desee. Ambos formatos informan sobre cuándo el botón se encuentra presionado o libre, usando el mismo tipo físico de joystick (analógico). El formato absoluto del joystick envía un mensaje únicamente cuando éste cambia de posición: resultando dicha medida un poco imprecisa en algunos casos. Otro tipo de formato de mensaje para Joystick, es el relativo. Mediante éste formato, se envía la información siempre que el joystick esté presionado sobre una dirección en concreto. Para seleccionar el tipo de joystick, envíe el mensaje GPD-SETCTYPE al gameport.device.

   BYTE buffer[100];
   /* código específico de programa aquí */
   buffer[0]=GPCT-RELJOYSTICK;
   /* o GPCT-ABSJOYSTICK */
   joymsg->io-Command=GPD-SETCTYPE;
   joymsg->io-Length=1;
   joymsg->io-Data=(APTR) buffer;
   SendIO (joymsg);
   Waitport (joyport);
   GetMsg (joyport); /* chequeo de errores */

Después de seleccionar el tipo de control, usted podrá indicar al periférico qué acciones deberá detectar el gameport (trigger events), tales como apretar/soltar el botón y los movimientos en X/Y. También podrá indicarle que envíe un mensaje cada vez que, transcurrido un tiempo, no se haya detectado ninguna acción con el joystick. Deberá pasar ésta información en la estructura adecuada (GamePortTrigger) al port.device:

   struct GamePortTrigger
   {
   UWORD gpt-Keys; /* flag de tecla apretada/soltada */
   UWORD gpt-Timeout; /* período de Timeout en 1/60 de segundo */
   UWORD gpt-XDelta; /* a 1 para Joystick */
   UWORD gpt-YDelta; /* a 1 para Joystick */
   };

Los últimos dos campos son más útiles para conocer la distancia del movimiento del ratón, así como el recorrido del mismo. Para informar al gameport.device de sus elecciones, añada un nuevo mensaje en joymsg, usando las condiciones trigger io-Data para el mensaje y un comando GPD-SETTRIGGER.

Con los parámetros y estructuras definidas, usted estará listo para comenzar a trabajar sobre las señales recibidas; por tanto podrá leer y decodificar los mensajes recibidos del Joystick.

   struct InputEvent joyevent;
   int code, dx, dy;
   /* código específico de programa */
   joymsg->io-Command=GPD-READEVENT;
   joymsg->io-Data=(APTR) & joyevent;
   joymsg->io-Length=sizeof(struct inputEvent);
   joymsg->io-Flags=0;
   for (;;)
   {
   SendIO (joymsg);
   WaitPort (joyport);
   GetMsg (joyport);
   code=joyevent.ie-Code;
   dx=joyevent.ie-X;
   dy=joyevent.ie-Y;
   if (code==IECODE-LBUTTON)
   else if (code==(IECODE-UP-PREFIX| IECODE-LBUTTON))
   if (dx>0)
   else if (dx<0)
   if (dy>0)
   else if (dy<0)
   }

Cada iteración del bucle captará una nueva señal del Bus, procesando ésta y mostrando el mensaje adecuado. Los botones, movimientos en X y movimientos en Y son independientes, pero pueden estar todos contenidos en un mismo mensaje.

Con práctica conseguirá manejar estas rutinas perfectamente, adecuándolas según las características de sus propios programas.


Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal