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:
ev-->0
Esto recibe la constante evtype_MouseInput
, para
indicar que lo que ha ocurrido ha sido una pulsación del ratón (y
no, por ejemplo, un redimensionado de la ventana).
ev-->1
toma el valor de la ventana que ha sido "pinchada"
(en este ejemplo, tomaría el valor gg_ventana_brujula
)
ev-->2
la coordenada X del pixel en que han pinchado (si la
ventana fuera de texto, rejilla, aquí tendríamos la coordenada X del
carácter sobre el que se ha pinchado)
ev-->3
la coordenada Y.
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.