AngoLinux

Pallina che rimbalza (in grafica)

- A cura del Prof. Stefano Salvi -


In questo momento in teoria si stà spiegando la struttura del processore. Non c'è materiale per sperimentare l'assembler. Occorrerà terminare la teoria generale del processore ed affrontare il processore reale prima di poter iniziare esercizi di assembler.
Si introducono quindi alcuni esercizi di vario genere, mirati in particolare alle operazioni bit a bit.

Il testo dell'esercizio è il seguente:

Scrivere un programma C che, utilizzando la svgalib, visualizzi un rettangolo sullo schermo ed una pallina di un pixel che, muovendosi sempre diagonalmente, rimbalzi sui quattro lati del rettangolo.
Note
  • Per una introduzone alle vgalib andare all'esperienza in Quarta
  • Per far muovere la 'pallina' occorre per prima cosa disegnarla nella posizione iniziale. Ogni volta che la dovremo muovere, per prima cosa la disegneremo con il colore dello sfondo nella vecchia posizione, per cancellarla, poi la disegneremo nella nuova posizione.
  • Per gestire il movimento il metodo più semplice è quello di prevedere due variabili che contengano lo spostamento lungo l'asse delle x e delle y. Quando la pallina raggiungerà uno dei bordi, non faremo altro che cambiare il segno del relativo incremento per ottenere il rimbalzo.
  • Per limitare la velocità della pallina, occorre introdurre un ritardo tra uno spostamento e l'altro. In un sistema multitasking non è opportuno creare ritardi con dei cicli vuoti che, oltre ad essere molto onerosi per il sistema, sono anche imprecisi ed inaffidabili. Per creare un ritardo in maniera affidabile e non onerosa si può usare la funzione usleep (<numero di microsecondi da attendere>);.

Una possibile soluzione è la seguente:
// Tizio - Pinco - 3AIN
// Pallina che rimbalza (in grafica)

#include <stdio.h>
#include <vga.h>	// Utilizza VGALIB

#define	ALTO		10	/* Bordo superiore del campo */
#define	SINISTRA	10	/* Bordo sinistro del campo */
#define	BASSO		100	/* Bordo inferiore del campo */
#define	DESTRA		150	/* Bordo destro del campo */

main()
{
int i;				// Contatore di passi
int dx=1;			// Incremento orizzontale (+1 o -1)
int dy=1;			// Incremento verticale (+1 o -1)
int x=(DESTRA + SINISTRA)/2;	// Posizione orizzontale della pallina (partre dal centro)
int y=(ALTO + BASSO)/2;		// Posizione verticale della pallina (partre dal centro)

  vga_init();			// Inizializza la libreria
  vga_setmode(G320x200x256);	// Entra in modalita' grafica
	
  // Disegna la cornice (i quattro lati)
  vga_drawline(SINISTRA,ALTO,DESTRA,ALTO);	// Superiore
  vga_drawline(SINISTRA,BASSO,DESTRA,BASSO);	// Inferiore
  vga_drawline(SINISTRA,ALTO,SINISTRA,BASSO);	// Sinistro
  vga_drawline(DESTRA,ALTO,DESTRA,BASSO);	// Destro

  vga_drawpixel(x,y);		// Disegna la 'pallina' iniziale

  for(i=1;i<500;i++)		// Ciclo di movimenti
  {
    vga_setcolor(0);		// Disegna col colore dello sfondo (cancella)
    vga_drawpixel(x,y);		// Cancella la pallina vecchia
		
    if(y==BASSO-1)		// Se ha raggiunto il bordo basso
    {
      dy = -1;			// rmbalza verso l'alto
    }
    if(y==ALTO+1)		// Se ha raggiunto il bordo alto
    {
      dy = 1;			// Rimbalza verso il basso
    }
    if(x==DESTRA-1)		// Se ha raggiunto il bordo destro
    {
      dx = -1;			// Rimbalza verso sinistra
    }
    if(x==SINISTRA+1)		// Se ha raggiunto il bordo sinistro
    {
      dx = 1;			// Rimbalza verso destra
    }

    x += dx;			// Si sposta (asse X)
    y += dy;			// Si sposta (asse Y)
		
    vga_setcolor(30);		// Colore della pallina	
    vga_drawpixel(x,y);		// Disegna la pallina nella nuova posizione

    usleep (10000);		// Pausa un centesimo di secondo
  }
  vga_setmode(TEXT);	// Ritorna in modalita' testo
}

Per provare il programma, scaricare il sorgente, compilarlo con il comando cc -lvga pallina.c ed eseguirlo con il comando ./a.out.

ATTENZIONE: i programmi che utilizzano la vgalib devono essere fatti partire con privilegio di root, altrimenti non possono far entrare la scheda video in modalità grafica.
Per fare questo o si entra in una console di testo (ALT-CTRL-F1) e si fà login come root, oppure si apre una finestra terminale e si assume l'identità di root con il comando su root.


[Home Page dell'ITIS "Fermi"] [Indice Terza] [Precedente] [Successivo]

© Ing. Stefano Salvi - Released under GPL licence