Le finestre grafiche e quelle a griglia di testo hanno la capacità di riconoscere i click del mouse e restituire le coordinate del pixel o del carattere selezionato. Per usufruire di questa capacità, per prima cosa dovete avvertire il programma di mettersi in ascolto dei click del mouse nella finestra o nelle finestre nelle quali li volete. Diciamo che avete una finestra grafica, gg_compasswin, in cui inserite l'immagine di un'elegante bussola ad otto raggi. Volete che il giocatore sia in grado di fare click su qualunque raggio, per averlo convertito nel comando per andare nella determinata direzione. Per prima cosa è necessario inserire la seguente riga in Initilise():
glk_request_mouse_event(gg_compasswin);
Il gioco si porrà in ascolto di uno, ed uno soltanto, click del mouse nella finestra con la bussola. Se non ce ne sono, va bene così; il programma continua ad accettare le righe di input come al solito. Ma se c'è un click, verrà richiamata HandleGlkEvent().
HandleGlkEvent() è stata illustrata nelle sezioni precedenti (consultate Grafica in una finestra grafica, ad esempio, o Suono e musica) ma questa è una spiegazione particolarmente chiara di come la routine funzioni. Come al solito, HandleGlkEvent() richiede gli argomenti "ev" e "context"; questa volta ev, un array, richiede una bella prova. Quando il programma intercetta un click del mouse, riempie l'array con le informazioni seguenti:
La vostra routine HandleGlkEvent, sarà quindi (almeno in parte):
[ HandleGlkEvent ev context; switch (ev-->0) { evtype_MouseInput: glk_request_mouse_event(gg_compasswin); ! Qui dobbiamo inserire il codice che analizza il ! risultato e genera le nuove istruzioni. Ad esempio, ! potremmo dire che se ev-->2 è compreso tra ! 50 e 100, e ev-->3 è tra 0 e 50, allora deve essere ! il raggio nord della bussola, e dobbiamo generare il ! comando go north (vai a nord). } ];
Notate che dopo il riconoscimento, e relativa reazione, di un click del mouse, il gioco smette di ascoltare altri input del mouse a meno che gli venga detto esplicitamente di ascoltarne un altro -- da qui la seconda chiamata a glk_request_mouse_event().
Ora, visto che è il gioco è in attesa di un input da riga, non potete semplicemente generare un comando come <<Go n_obj>>;. Dovete, invece, fare quello che segue. Prima di tutto tornate alla riga nella quale avete dichiarato HandleGlkEvent() e dichiarate tre nuove variabili locali: abortres, newcmd e cmdlen. Poi, tornate nel punto in cui eravate e cancellate la riga di input con:
glk_cancel_line_event(gg_mainwin, 0);
Quindi arriviamo al comando che faccia la stessa cosa. Nel nostro esempio, "go north" è quello giusto. Impostatelo come il nuovo comando in questo modo:
newcmd = "go north";
Poi copiate pari pari il seguente codice:
cmdlen = PrintAnyToArray(abortres+WORDSIZE, INPUT_BUFFER_LEN-WORDSIZE, newcmd); abortres-->0 = cmdlen;
Quello che fa è completare il processo con il quale si dice al computer che in questo caso particolare, il click su quella particolare area della finestra grafica è perfettamente equivalente all'aver digitato "go north" ed aver premuto Invio. Ora potete inserire quella frase direttamente al prompt, per far sapere al giocatore quello che è stato fatto, o potete fare qualcosa come questo:
glk_set_style(style_Input); print "(mouse click)"; glk_set_style(style_Normal); new_line;
Che è il metodo migliore un base alle preferenze personali ed al particolare caso considerato. In ogni caso, l'ultima riga in ognuno di questi blocchi di codice deve essere "return 2;", indicante il termine di questo turno. Et voila -- avete avuto a che fare con gli input del mouse.