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;
}