Lezione 7, Pulsante di rivelamento
RyujiAndy | apr 19, 2009 | Commenti 0
In questa lezione come in quella precedente tratteremo la visualizzazione di un’immagine e la creazione di un cursore per il rilevamento di un pulsante.
La struttura è come al solito:
- Codice sorgente (cartella)
- include (cartella)
- about.jpg (file immagine)
- source (cartella)
- main.c (file sorgente) Parte1 Parte2 Parte3 Parte4
- picture.s (file variabili immagine)
- Makefile (file per la compilazione) Parte1 Parte2 Parte3 Parte4 Parte5
Come ricordate il codice visto nella lezione precedente abbiamo visulizzato un cursore che possiamo controllare con il pad del GameCube:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int cursor_x = 300; int cursor_y = 250; while(1) { PAD_ScanPads(); if (PAD_StickY(0) > 18) { cursor_y--; } if (PAD_StickY(0) < -18) { cursor_y++; } if (PAD_StickX(0) > 18) { cursor_x++; } if (PAD_StickX(0) < -18) { cursor_x--; } VIDEO_ClearFrameBuffer (rmode, xfb, COLOR_BLACK); DrawBox (cursor_x, cursor_y, cursor_x + 1, cursor_y + 1, COLOR_WHITE); VIDEO_WaitVSync(); } |
Ora è necessario per il nostro scopo sotituira la funzione “Draw_Box()” con “display_jpeg()”:
1 | display_jpeg(about, cursor_x, cursor_y); |
Compilando il codice ora abbiamo il cursore come un immagine “JPEG”.
Rilevamento cliccando il pulsante
Per individuare il pulsante da cliccare abbiamo bisogno di conoscere quattro coordinate x1, y1 e x2, y2, cioè il vertice in alto a sinistra e quello in basso a destra del pulsante, purtroppo al momento non ho trovato nessuna regola per calcolare queste coordinate, visto che le coordinate dell’immagine non corrispondono con le coordinate x,y reali, quindi il modo più semplice che ho elaborato è effettuando alcune prove, quindi riicambiamo il cursore da immagine “JPEG” al nostro punto visualizzato dalla funzione “Draw_Box()” e in più inseriamo un comando per visualizzare le coordinate del cursore:
1 2 3 4 5 6 | u16 buttonsDown = PAD_ButtonsDown(0); if( buttonsDown & PAD_BUTTON_A ) { printf("x = %i. y = %in", cursor_x, cursor_y); usleep(500000); } |
Sto usando “printf” per visualizzare due interi, x e y, questo avviene ogni volta che clicchiamo il pulsante “A” del “PAD” la funzione “usleep()”, come sugerisce il nome serve per creare una pausa nel programma in microsecondi quindi il valore “500000″ equivalqono a circa mezzo secondo.
prima di utilizzare “usleep()” è necessario includere:
1 | #include |
nell’header di “unistd.h” sono incluse funzioni di cui comprende quella che stiamo utilizzando noi cioè “usleep()”, senza di essa avverrebe un errore durante la compilazione del codice sorgente.
Ora una volta compilato il codice e fatto avviare su wii, non ci resta che individuare le quattro coordinate che ci interessano cliccando ai due vertici dell’immagine che ci interessa che dovrebbero essere nel nostro caso a: 202, 120 (in alto a sinistra) e 245, 141 (in basso a destra).
Ora avendo le coordinate non ci resta che scrivere il codice che identifica l’immagine quando il cursore vi si trova sopra:
1 2 3 | if (cursor_x >= 202 && cursor_x <= 254 && cursor_y >= 120 && cursor_y <= 141) { printf("Bottone premuton"); } |
Quindi se le coordinate del cursore x sono maggiori o uguale a 202 ma non sono minori o uguali a 254 e le coordinate y sono maggiori o uguali a 120 ma non sono minori o uguale a 141, ci viene visualzzata la scitta che il “Bottone premuto”.
Se qualcuno riuscisse a trovare un metodo più semplice per individuare le coordinate sarei molto felice di semplificare questo sistema, ma fino ad allora credo che continuerò ad usarlo.
Grazie e alla prossima.
RiujiAndy
Tratto e concesso da: http://ryujiandy.ath.cx/
Filed Under: Programmazione