Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C/C++] Come riconosco cosa tocco?

    Ciao, sto imparando ad usare delle librerie grafiche, ma ho un neorme dubbio...
    Vorrei fare un giochetto d'avventura a scorrimento verticale... Tipo `supermario`, dove l'omino corre, salta, si arrampica etc.
    Sono più o meno in grado di fare tutto, tranne una cosa: come capisco quando tocca qualcosa?
    Mi spiego meglio: ho un centinaio di mattoncini nel livello. L'omino chiaramente non può oltrepassarli, ma deve fermarcisi sopra...
    Come capisco quando li tocca? Per capire quando tocca la coordinata `X==100` basta che faccio `if (omino.x == 100) {...` Ma per controllare ogni mattoncino?
    ho provato mettendo un centinaio di IF nel ciclo principale che controllano una per una tutte le mattonelline, ma non mi sembra il massimo: il programma va lentissimo...
    Come posso fare?
    Qualcuno ha qualche consiglio?

    Grazie
    PuffolottO


    PS: Sono le librerie SDL, ma penso che questo problema ci sia con qualunque libreria.

  2. #2
    Dividi le mattonelle in sezioni da 4 mattonelle.
    Logicamente ogni zona avra un bool past che dira se il giocatore vi è sopra o no.
    codice:
    [][]
    [][]
    Cosi se entra nella zona e ok se la sorpassa (past = TRUE) glielo impedisci.
    codice:
    [*][]           SI(past = FALSE)
    [][]
    
    [][]*           NO(past = TRUE)
    [][]
    Cosi dovresti fare almeno 1/4 delle operazioni.
    Oltretutto dovresti "controllare" solo una parte delle zone, cioe quelle laterali.





    P.S: posso vedere il codice che mi interessa?
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  3. #3
    Ehm... Non ho capito bene ciò che intendi dire... Puoi rispiegarmelo?


    Vuoi imparare anche te ad usare le SDL?
    Magari ci aiutiamo a vicenda... Non si trova tanta roba sulla libreria, ed è quasi tutto in inglese...


    Tieni il codice, per ora c'è solo l'omino, non ci sono le mattonelle, le ho tolte aspettando di scoprire come fare il controllo...
    Appena sarà pronto se ne starà sotto la licenza GPL

    codice:
    /*
    Si compila con il comando
    g++ `sdl-config --libs` -I/usr/include/SDL -o cpp2 cpp2.cpp
    */
    
    #include <iostream>
    using namespace std;
    
    #include "SDL.h"
    
    #define SCREENWIDTH 512
    #define SCREENHEIGHT 348
    #define SCREENBPP 0
    #define SCREENFLAGS SDL_ANYFORMAT
    #define SPEED 4
    
    int main (int argc, char *argv[]) {
    
      // 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' ball.bmp.
      SDL_Surface *immagine = SDL_LoadBMP ("ball.bmp");
    
      // Creo base, eroe e nemico, tre rettangoli SDL
      SDL_Rect base, eroe;
      // 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
      eroe = base;
      
      // 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;
    
      // Creo il ciclo principale, che continuera' a ciclare mentre loop e' vero
      while (loop) {
    
        // 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 >= 200) {
        	eroe.y = 200;
        	toccasotto = 1;
        } else toccasotto = 0;
        
        if (salto > -20 && !toccasotto) salto -= 1;
        if (salto < 0 && toccasotto) salto = 0;
    
        // Muovo eroe
        eroe.y -= salto;
        eroe.x += movx;
    
        // Pulisco la finestra
        SDL_FillRect (finestra, NULL, 0);
    	
        // 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;
    }
    PS: Devi mettere nella cartella dove hai il programma un immagine ball.bmp, se no da "segmentation fault".

  4. #4
    Dividi le mattonelle in sezioni da 4 mattonelle.
    Logicamente ogni zona avra un bool past che dira se il giocatore vi è sopra o no.
    codice:
    [][]
    [][]
    Cosi se entra nella zona e ok se la sorpassa (past = TRUE) glielo impedisci.
    codice:
    [*][]           SI(past = FALSE)
    [][]
    
    [][]*           NO(past = TRUE)
    [][]
    Cosi dovresti fare almeno 1/4 delle operazioni.
    Oltretutto dovresti "controllare" solo una parte delle zone, cioe quelle laterali.

    Cmq io uso Il Borland C++ Builder Enterprise e stavo pensando anche io di fare un gioco simile.
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  5. #5
    Originariamente inviato da Luc@s
    Dividi le mattonelle in sezioni da 4 mattonelle.
    Logicamente ogni zona avra un bool past che dira se il giocatore vi è sopra o no.
    codice:
    [][]
    [][]
    Cosi se entra nella zona e ok se la sorpassa (past = TRUE) glielo impedisci.
    codice:
    [*][]           SI(past = FALSE)
    [][]
    
    [][]*           NO(past = TRUE)
    [][]
    Cosi dovresti fare almeno 1/4 delle operazioni.
    Oltretutto dovresti "controllare" solo una parte delle zone, cioe quelle laterali.

    Cmq io uso Il Borland C++ Builder Enterprise e stavo pensando anche io di fare un gioco simile.
    Ahh... Forse ho capito... Divido la finestra in 4 zone (ad esempio una tra 0x e 200x e tra 0y e 200y, un altra tra 200 e 400 e così via) e se l'omino sta fra quelle coordinate, controllare solo le mattonelle in quella zona? Buona idea

  6. #6
    Originariamente inviato da Puffolott0
    Ahh... Forse ho capito... Divido la finestra in 4 zone (ad esempio una tra 0x e 200x e tra 0y e 200y, un altra tra 200 e 400 e così via) e se l'omino sta fra quelle coordinate, controllare solo le mattonelle in quella zona? Buona idea
    Ti piace???
    Se hai bisogno di altro so qui
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  7. #7
    Originariamente inviato da Luc@s
    Ti piace???
    Se hai bisogno di altro so qui
    Va molto meglio... Sto aggiungendo le mattonelle... Se vuoi ti riposto il codice appena ho fatto...

  8. #8
    Originariamente inviato da Puffolott0
    Va molto meglio... Sto aggiungendo le mattonelle... Se vuoi ti riposto il codice appena ho fatto...
    Ok!
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  9. #9
    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;
    }




  10. #10
    codice:
    /*
    Si compila con il comando
    g++ `sdl-config --libs` -I/usr/include/SDL -o cpp2 cpp2.cpp
    */
    
    
    #include <iostream>
    #include <cmath>
    #include <ctime>
    
    using namespace std;
    
    #include "SDL.h"
    
    #define SCREENWIDTH 512
    #define SCREENHEIGHT 348
    #define SCREENBPP 0
    #define SCREENFLAGS SDL_ANYFORMAT
    #define SPEED 4
    #define NUMERO 100
    
    /*
    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[]) {
      // 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;
    		int max = NUMERO;
    		max -= 5; // c' era un orrorino qui ;)
    		for (int i = 0; i < max; 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;
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.