guida alla programmazione grafica in c/c++

Transcript

guida alla programmazione grafica in c/c++
GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C
.:luxx:.
PREMESSE
• In questa guida non verranno trattati i costrutti di flusso, le
funzioni, o comunque le caratteristiche del linguaggio, che si
danno come presupposte.
• Il software che utilizzeremo sarà l’IDE Dev c++, di cui sono
riuscito a trovare solo versioni per windows.
A questo link potrete trovare la distribuzione per ambiente
windows.
Installiamo ed eseguiamo il wizard del programma per la sua
configurazione.
Per lavorare in grafica abbiamo bisogno delle librerie allegro,
quindi scarichiamo l’aggiornamento andando in:
strumenti - cerca aggiornamenti e scaricando il pacchetto allegro.
INTRODUZIONE
Salve, questa guida tratta di programmazione grafica in C.
Tratteremo grafica bidimensionale, non 3D.
La programmazione grafica risulta semplice, ma allo stesso tempo,
necessita di una buona capacità di ragionamento per arrivare alla
soluzione del problema prefissato.
LET’S START!
Bene, ora siamo nel nostro ambiente di sviluppo, dobbiamo aprire
un nuovo progetto;
file – nuovo – progetto – multimedia - allegro application(DLL)
selezioniamo inoltre, il linguaggio c standard.
Il risultato sarà un sorgente dato di standard dove vengono definiti
alcuni parametri per il nostro lavoro; proviamo a fare compila e poi
esegui (F9).
Ecco che compare di output una finestra 640X480 di colore nero.
Analizziamo il corpo sorgente.
while (!key[KEY_ESC]) {} indica che l’output generato sarà
visualizzato
sino a quando non verrà premuto il tasto ESC.
Ciò che sta al di fuori della funzione main() serve a definire
l’output, ad esempio
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640,
480, 0, 0);
definisce le dimensioni dell’output.
In ambiente grafico si lavora moltissimo con le funzioni; per avere
sotto mano le funzioni date di standard da allegro, andiamo a
cercare il file allegro.chm nella directory del software ad esempio:
C:\Dev-Cpp\docs\allegro\allegro.chm
Noi, a livelli base, useremo le funzioni che si trovano in API Drawing Primitives.
Iniziamo a scrivere un po’ di codice.
Prendiamo in considerazione la funzione line()
La sua sintassi è
line(output(noi useremo screen), x, y, x2, y2, colore);
dove x e y sono le coordinate di un estremo del segmento e x2 e
y2 sono le coordinate dell’altro estremo.(vedi immagine seguente)
come riferimento va ricordato che il primo punto in alto a sinistra
ha coordinate (0,0), l’ultimo punto in basso a destra, ha
coordinate, in questo caso, (639, 479).
…
void init();
void deinit();
int x = 30;
int y = 30;
int x2 = 90;
int y2 = 90;
int bianco = 0xffffff;
int main() {
init();
while (!key[KEY_ESC])
{ line(screen, x, y, x2, y2, bianco);
}
…
Produrrà questo risultato(le coordinate le ho aggiunte io in paint)
Il nostro programma quindi ci ha disegnato una linea sull’ouput,
alle coordinate che gli avevamo assegnato.
Ora proviamo, per farvi notare una cosa, a incrementare o a
decrementare una coppia delle variabili ad esempio aggiungere nella
while(!key[KEY_ESC]) i valori
x = x – 10;
x2 = y – 10;
mandate in esecuzione e lasciatelo eseguire per una decina di
secondi, notiamo quindi che vengono disegnate linee verso destra,
e queste linee continuano fino a quando non viene premuto il tasto
ESC; dove sta il problema? Le linee, ad un certo punto spuntano di
nuovo da sinistra e continuano verso destra e così via.
Il perché di questo si trova nella dichiarazione; noi abbiamo
dichiarato le variabili come int; int copre i valori da
−2.147.483.648 a +2.147.483.647, ad ogni while il valore
aumenta e quando supera il valore massimo riparte dal valore
minimo e viceversa.
La soluzione, molto semplice, sta nell’introdurre una variabile, che
io per abitudine chiamo myflag e inizializzarla con valore 0;
successivamente nella while inseriremo una if del tipo
If(myflag == 0) { codice }
E al di fuori della if cambieremo il valore di myflag cosicché la
while si ripeta una volta sola.
Il codice finale sarà:
#include <allegro.h>
void init();
void deinit();
int x = 30;
int y = 30;
int x2 = 90;
int y2 = 90;
int bianco = 0xffffff;
int myflag = 0;
int main()
{ init();
while (!key[KEY_ESC])
{ if (myflag == 0)
{ line(screen, x, y, x2, y2, bianco);
x = x + 10;
x2 = x2 + 10;
}
myflag = 1;
}
deinit();
return 0;
}
END_OF_MAIN()
….
Abbiamo detto che in grafica in C si lavora sulle funzioni standard
di allegro, vediamone altre 4 di base.
Rect(output, x, y, x2, y2, colore);
La sintassi è praticamente identica a quella di line().
Da questa funzione viene disegnato un rettangolo; le coordinate, x,
y, x2, y2, sono le coordinate degli estremi della diagonale del
rettangolo, sulla diagonale verranno costruiti i lati e si formerà la
figura.
Circle(output, x, y, raggio, colore);
questa funzione disegna un cerchio.
Le coordinate x e y sono le coordinate del centro, raggio è per
l’appunto una variabile che definisce il raggio del cerchio.
Queste due funzioni disegnano appunto solo il contorno della
figura, se si vuole ottenere un riempimento, bisogna utilizzare le
funzioni rectfill() e circlefill() che hanno la stessa sintassi delle
precedenti.
Esempio:
#include <allegro.h>
void init();
void deinit();
int x = 30;
int y = 30;
int x2 = 90;
int y2 = 90;
int bianco = 0xffffff;
int rosso = 0xff0000;
int blu = 0x0000ff;
int verde = 0x00ff00;
int giallo = 0xffff00;
int raggio = 120;
int myflag = 0;
int main() {
init();
while (!key[KEY_ESC])
{ if (myflag == 0)
{line(screen, x, y, x2, y2, bianco);
rect(screen, x + 40, y + 40, x2 + 180, y2 + 180, rosso);
circle(screen, x + 460, y + 140, raggio, blu);
rectfill(screen, x + 300, y + 320, x2 + 550, y2 + 380,
giallo);
circlefill(screen, x + 200, y + 300, raggio - 60, verde);
}
myflag = 1;
}
deinit();
return 0;
}
END_OF_MAIN()
….
Che darà come risultato
Con un po' di inventiva e immaginazione si possono trovare tutta
una serie di “disegni” da fare.
Un buon esercizio sarebbe quello di disegnare, ad esempio una
scacchiera, con le pedine di dama.
Ricordo che il fatto non sta nel dare delle coordinate numeriche
ogni volta alle coordinate delle figure, ma trovare il giusto
algoritmo che porta alla soluzione.
Questo è il mio risultato.
Buon lavoro
.:luxx:.