//Para compilar: g++ -o test fuga.cpp `sdl-config --cflags --libs` #include #include #include #include #include #define ARRIBA 0 #define ABAJO 1 #define IZQUIERDA 2 #define DERECHA 3 #define NUMBLOQUES 4 using namespace std; //MAPA int mapa[24][32] = { {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,5,5,5,5,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,25,5,5,5,5,5,25}, {25,5,5,5,5,25,25,25,25,25,25,25,25,25,25,16,16,25,25,25,25,25,25,25,25,25,5,5,5,5,5,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,25}, {25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25}}; //VARIABLES SDL_Surface *screen; SDL_Surface *pantallaOculta; SDL_Surface *protagonista; SDL_Surface *bloque1; //SDL_Surface *bloque2; int i,j; int tam=25; int hecho; int fuera=0; Uint8 *keys; //Indican en que parte de la pantalla se dibuja el heroe y el bloque al comienzo, están en múltiplo de 25, que es el tamaño del tile int xHeroe=300,yHeroe=325; int xBloque[NUMBLOQUES] = {225,250,225,300}; int yBloque[NUMBLOQUES] = {250,275,150,300}; int xBloquei,yBloquei,xBloquej,yBloquej; int estado=ABAJO; int anterior; int dibX,dibY; SDL_Surface *image; SDL_Rect dest; SDL_Event event; //Dibuja la matriz en la pantalla, cada número de la matriz indica un tile del gráfico future.bmp void Dibujar(SDL_Surface * img, int x, int y, int w, int h, int x2, int y2) { SDL_Rect dest; dest.x = x; dest.y = y; SDL_Rect src; src.x = x2; src.y = y2; src.w = w; src.h = h; SDL_BlitSurface (img, &src, screen, &dest); } //Dibuja al bloque void DibujarBloque(int x, int y) { SDL_Rect dest; dest.x=x; dest.y=y; SDL_BlitSurface(bloque1, NULL, screen, &dest); } //Dibuja al heroe void DibujarHeroe (int x, int y,int w, int h, int x2, int y2) { SDL_Delay(50); SDL_Rect dest; dest.x=x; dest.y=y; SDL_Rect src; src.x = x2; src.y = y2; src.w = w; src.h = h; SDL_BlitSurface(protagonista, &src, screen, &dest); } //Mueve al heroe y calcula colisiones con el muro (tile=25) y si hay bloque lo empuja void MoverHeroe() { keys=SDL_GetKeyState(NULL); //Si se pulsa arriba y la casilla del mapa[][]=25 hay colisión, se divide entre tam (tam=25) //porque 25 era el tamaño de cada pixel if ((keys[SDLK_UP]) && (mapa[(yHeroe-tam)/tam][(xHeroe)/tam]!=25)) { if(estado==ARRIBA){ if(anterior==25){ anterior=50; } else{ anterior=25; } dibY=0; dibX=anterior; hecho = 0; for (i=0;iformat, 255, 255, 255)); SDL_SetAlpha(protagonista,SDL_SRCALPHA|SDL_RLEACCEL,255); done = 0; while (!done) { SDL_Event event; //Eventos. Cerrar ventana while (SDL_PollEvent (&event)) { switch (event.type) { case SDL_KEYDOWN: break; case SDL_QUIT: done = 1; break; default: break; } } //Dibujar pantalla for (i=0; i<24; i++) for (j=0; j<32; j++) { Dibujar(image, j*tam, i*tam, tam, tam,mapa[i][j]*tam, 0); } for (i=0; i