HiperenlacesOtros trucosOtros trucosEntrada por ratón

Entrada por ratón

Las ventanas de tipo texto y las de tipo rejilla tienen la interesante capacidad de reconocer cuándo se pulsa un ratón sobre ellas, y de retornar las coordenadas de la letra o pixel que se ha seleccionado. Para sacar partido de esta capacidad, primero debes alertar al programa de que tiene que estar alerta para detectar las pulsaciones de ratón en la ventana o ventanas que te interesen. Por ejemplo, digamos que tienes una ventana gráfica, gg_ventana_brujula, en la que has puesto una imagen de una rosa de los vientos de ocho puntas. Quieres que el jugador pueda clicar sobre cualquiera de las puntas y que eso se convierta en un comando para ir en la dirección apropiada. Lo primero, necesitas añadir la siguiente línea a la rutina Inicializar():

   glk_request_mouse_event(gg_ventana_brujula);

El juego estará alerta para detectar una pulsación, y sólo una, del ratón en la ventana que tiene la rosa de los vientos. Si no ocurre ninguna, no pasa nada; el programa aceptará igualmente la entrada habitual por el teclado. Pero si ocurre una, se disparará la rutina HandleGlkEvent(). HandleGlkEvent() ya ha aparecido en secciones previas (mira "Imágenes en una ventana gráfica", por ejemplo, o en "Música y sonido") pero este es un caso especialmente claro de cómo funciona la rutina. Como siempre, la rutina HandleGlkEvent() recibe los parámetros ev y contexto; esta vez ev, que es un array, traerá bastante información. Cuando el programa detecta una pulsación de ratón, rellena el array con la siguiente información:

Tu rutina HandleGlkEvent, entonces, tendría el siguiente aspecto (al menos en parte):

   [ HandleGlkEvent ev contexto;
      switch (ev-->0) {
         evtype_MouseInput:
            glk_request_mouse_event(gg_ventana_brujula);
            ! Aqui pondriamos codigo para analizar los resultados y
            ! generar instrucciones nuevas. Por ejemplo, podriamos
            ! hacer que si ev-->2 esta entre 50 y 100, mientras
            ! ev-->3 esta entre 0 y 50, entonces se habria pinchado
            ! en la flecha norte de la brujula, y entonces
            ! lanzariamos el comando para ir al norte
      }
   ];

Obsérvese que, una vez que el juego ha detectado una pulsación del ratón, dejará de detectar más pulsaciones de ratón en esa ventana, a menos que le indiquemos que espere por otra. De ahí la llamada a a glk_request_mouse_event() que aparece en el código anterior. Ahora, debido a que el juego está esperando a que el jugador complete su línea de comandos, no podemos simplemente lanzar un comando interno en el juego del tipo <<Ir Obj_n>>. En vez de eso, tendremos que hacer lo siguiente: Primero, vete hasta la línea en que comienza la rutina HandleGlkEvent y declara tres nuevas variables locales: abortres, comandonuevo y longcomando. Después, tras aceptar el click de ratón, cancelaremos la entrada de línea del teclado, poniendo:

   glk_cancel_line_event(gg_mainwin, 0);

Ahora, imagina un comando que, tecleado por el jugador, haría lo que quieres que ocurra. En este ejemplo, el comando podría ser "ir norte", o "norte". Haz que éste sea el nuevo comando en la forma siguiente:

   nuevocomando = "ir norte";

Y después copia el siguiente código tal cual:

   longcomando = PrintAnyToArray(abortres+WORDSIZE,
      INPUT_BUFFER_LEN-WORDSIZE, comandonuevo);
   abortres-->0 = longcomando;

Lo que hace lo anterior es completar el proceso para decirle al computador que en este caso particular, pinchar el ratón en ese área concreta de la ventana gráfica, equivale exactamente a teclear "ir norte" y pulsar Intro. Ahora, puedes hacer que ese texto aparezca tras el prompt, para que el jugador vea lo que ha ocurrido, o simplemente hacer algo como:

   glk_set_style(style_Input);
   print "(click de ratón)";
   glk_set_style(style_Normal);
   new_line;

Qué método es el mejor depende de los gustos personales, y del caso particular que tengamos entre manos. En cualquier caso, la última línea de estos bloques de código ha de ser return 2;, para indicar que este turno ha finalizado. Et voilà - ya has manejado la entrada por ratón.


HiperenlacesOtros trucosOtros trucosEntrada por ratón