Ecco fatto...
C'ho fatto un giochetto idiotissimo
Servono le immagini ball.bmp, palla.bmp e eroe.bmp...
Ho scoperto che non è servito dividere il campo di gioco in sezioni... E' lo stesso leggero, chissà che casino avevo fatto l'altro giorno per renderlo lentissimo




PS: Se ci vedi qualcosa fatto malissimo dimmelo
Presto devo aggiustare il modo di fermarsi sui mattoncini perchè così fa pena...


codice:
/*
Si compila con il comando
g++ `sdl-config --libs` -I/usr/include/SDL -o cpp2 cpp2.cpp
*/


#include <iostream>

#include <math.h>

using namespace std;

#include "SDL.h"

#define SCREENWIDTH 512
#define SCREENHEIGHT 348
#define SCREENBPP 0
#define SCREENFLAGS SDL_ANYFORMAT
#define SPEED 4

/*
class eroe {
  int x, y, w, h;
public:
  eroe (int posx, int posy, int width, int eight) {
    x = posx;
    y = posy;
  }
};
*/

int main (int argc, char *argv[]) {

int NUMERO = 100;

  // Inizializzo il sistema video delle SDL
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    cout << "Non e' possibile inizializzare le SDL per il seguente motivo: \"" << SDL_GetError() << "\".\n\n";
    return 1;
  }

  /* Creo la finestra 'finestra' di dimensioni SCREENWIDTHxSCREENHEIGHT px (guarda i #define a inizio riga),
     che abbia SCREENBPP bits per pixel (se SCREENBPP e' 0, e' pari a quella in utilizzo),
     e che sia messa in una comune finestra del window menager in utilizzo.                               */
  SDL_Surface *finestra = SDL_SetVideoMode (SCREENWIDTH, SCREENHEIGHT, SCREENBPP, SCREENFLAGS) ;

  // Carico la bitmap 'immagine' eroe.bmp.
  SDL_Surface *immagine = SDL_LoadBMP ("eroe.bmp");

  // Creo base, eroe e nemico, tre rettangoli SDL
  SDL_Rect base, eroe; //, nemico;
  // La largezza di base diventa uguale alla larghezza di immagine
  base.w = immagine->w;
  // L'altezza di base diventa uguale all'altezza di immagine
  base.h = immagine->h;
  // Setto le coordinate x e y di base a zero
  base.x = 0;
  base.y = 0;
  // Apporto i valori di base a eroe// e a nemico, quest'ultimo lo sposto a 200x 200y
  eroe = base;
  //nemico = nemicobase;
  //nemico.x = nemico.y = 100;
  
  // Carico la bitmap 'mattoimg' ball.bmp.
  SDL_Surface *mattoimg = SDL_LoadBMP ("ball.bmp");
  // Creo base, eroe e nemico, tre rettangoli SDL
  SDL_Rect mattobase, matto[NUMERO]; //, nemico;
  // La largezza di base diventa uguale alla larghezza di immagine
  mattobase.w = mattoimg->w;
  // L'altezza di base diventa uguale all'altezza di immagine
  mattobase.h = mattoimg->h;
  // Setto le coordinate x e y di base a zero
  mattobase.x = 0;
  mattobase.y = 0;
  
  
    // Carico la bitmap 'puntoimg' palla.bmp.
  SDL_Surface *puntoimg = SDL_LoadBMP ("palla.bmp");
  // Creo base, eroe e nemico, tre rettangoli SDL
  SDL_Rect puntobase, punto; //, nemico;
  // La largezza di base diventa uguale alla larghezza di immagine
  puntobase.w = puntoimg->w;
  // L'altezza di base diventa uguale all'altezza di immagine
  puntobase.h = puntoimg->h;
  // Setto le coordinate x e y di base a zero
  puntobase.x = 0;
  puntobase.y = 0;
  // Apporto i valori di base a eroe// e a nemico, quest'ultimo lo sposto a 200x 200y
  punto = puntobase;
  
  srand((unsigned)time(NULL));
  
	punto.y = rand() % (SCREENHEIGHT - puntobase.h);
	punto.x = rand() % (SCREENWIDTH - puntobase.w);
  
  for (int i = 0; i < NUMERO; i++) {
  	matto[i] = mattobase;
	matto[i].y = rand() % (SCREENHEIGHT - mattobase.h);
	matto[i].x = rand() % (SCREENWIDTH - mattobase.w);
  }
  
  
  
  
  // Inizializzo la variabile evento che serve a captare gli eventi
  SDL_Event evento;

  // Inizializzo la variabile loop a 1, il ciclo principale verra' ripetuto mentre loop vale 1
  bool loop = 1, toccasotto = 0;

  // Inizializzo le variabili del movimento movx e movy
  int movx = 0, movy = 0, salto = 0, punteggio = 0;

  // Creo il ciclo principale, che continuera' a ciclare mentre loop e' vero
  while (loop) {

	toccasotto = 0;


    for (int l = 0; l < NUMERO; l++) {
    
    	// Se la X dell'eroe ha almeno un pixel sulla X della mattonella E i piedi dell'eroe sono compresi nella Y della mattonella...
    	if ( ( (eroe.y+base.h) <= (matto[l].y+mattobase.h)   &&   (eroe.y+base.h) >= matto[l].y )   &&   ( eroe.x < (matto[l].x+mattobase.w)   &&   (eroe.x+base.w) > matto[l].x ) ) {
    	
/*    		cout << "Ti trovi a Y=" << eroe.y+eroe.h << ",  X=" << eroe.x+eroe.w <<
			". Hai toccato matto[" << l << "] che e' a Y=" << matto[l].y <<
			", X=" << matto[l].x<< ".\n";*/
    		
    		eroe.y = matto[l].y - base.h;
    		
    		if (salto < 0) salto = 0;
    		
    		toccasotto = 1;
    		
   		}
   	}

   	if (eroe.y <= 0) {
    	eroe.y = 0;
    	salto = 0;
   	}
   	if (eroe.x <= 0)	eroe.x = 0;
	if (eroe.x+base.w >= SCREENWIDTH) eroe.x = SCREENWIDTH - base.w;
   		
    if (eroe.y+eroe.h >= SCREENHEIGHT) {
    	eroe.y = SCREENHEIGHT - base.h;
    	toccasotto = 1;
   	}
   	
    if (salto > -20 && !toccasotto) salto -= 1;
    if (salto < 0 && toccasotto) salto = 0;

    // Se e' stato trovato un evento...
    if (SDL_PollEvent(&evento)) {

      // Guardo che tipo di evento e'...
      switch (evento.type) {

        // Se e' il segnale di uscita della finestra...
        case SDL_QUIT:
          // Setto la variabile loop a zero, ponendo fine al ciclo
          loop = 0;
          // Ed esco dallo switch
          break;

        // Se e' il segnale della pressione di un tasto...
        case SDL_KEYDOWN:
          // Guardo che tasto e' stato premuto...
          switch (evento.key.keysym.sym) {

            // Se il tasto premuto e' ESC o la lettera Q
            case SDLK_ESCAPE:
            case SDLK_q:
              // Setto la variabile loop a zero, ponendo fine al ciclo
              loop = 0;
              break;

            // Se il tasto premuto e' la freccia su
            case SDLK_UP:
              // Se tocco il fondo diminuisco la variabile di movimento verticale
              if (toccasotto) salto = 10;
              break;

            // Se il tasto premuto e' la freccia sinistra
            case SDLK_LEFT:
              // Diminuisco la variabile di movimento orizzontale
              movx -= SPEED;
              break;

            // Se il tasto premuto e' la freccia destra
            case SDLK_RIGHT:
              // Aumento la variabile di movimento orizzontale
              movx += SPEED;
              break;
          }
          break;

        // Se e' il segnale della pressione di un tasto...
        case SDL_KEYUP:
          // Guardo che tasto e' stato premuto...
          switch (evento.key.keysym.sym) {
           
            // Se il tasto rilasciato e' la freccia su
            case SDLK_UP:
              // Se sta andando verso l'alto stoppo il salto
              if (salto >= 0) salto = 0;
              break;

            // Se il tasto rilasciato e' la freccia sinistra
            case SDLK_LEFT:
              // Aumento la variabile di movimento orizzontale
              movx += SPEED;
              break;

            // Se il tasto rilasciato e' la freccia destra
            case SDLK_RIGHT:
              // Diminuisco la variabile di movimento orizzontale
              movx -= SPEED;
              break;
          }
      }
    }
    



	if ( ( eroe.y < (punto.y+puntobase.h)   &&   (eroe.y+base.h) > punto.y )   &&   ( eroe.x < (punto.x+puntobase.w)   &&   (eroe.x+base.w) > punto.x ) ) {
		punteggio++;
		cout << "Hai vinto un punto!!! Adesso sei a " << punteggio << " punti!\n";
		punto.y = rand() % (SCREENHEIGHT - puntobase.h);
		punto.x = rand() % (SCREENWIDTH - puntobase.w);
		matto[NUMERO-1].x = matto[NUMERO-1].y = -1;
		NUMERO -= 5;
		for (int i = 0; i < NUMERO; i++) {
			matto[i] = mattobase;
			matto[i].y = rand() % (SCREENHEIGHT - mattobase.h);
			matto[i].x = rand() % (SCREENWIDTH - mattobase.w);
		}
	}

   	


	// Muovo eroe
    eroe.y -= salto;
    eroe.x += movx;

    // Pulisco la finestra
    SDL_FillRect (finestra, NULL, 0);

	for (int k = 0; k < NUMERO; k++) {
		SDL_BlitSurface (mattoimg, &mattobase, finestra, &matto[k]);
	}
	
	// Ci metto il punto
	SDL_BlitSurface (puntoimg, &puntobase, finestra, &punto);
	
    // Ci inserisco eroe
	SDL_BlitSurface (immagine, &base, finestra, &eroe);
	
    // Ed aggiorno lo schermo
    SDL_UpdateRect (finestra, 0, 0, 0, 0);


	SDL_Delay(15);
  }

  return 0;
}