//Para compilar: g++ -o test fuga.cpp `sdl-config --cflags --libs` #include #include #include #include #include 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 *bloque; int i,j; int tam=25; 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=275,yHeroe=300; int xBloque=225,yBloque=250; 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 heroe void DibujarHeroe(int x, int y) { SDL_Delay(50); SDL_Rect dest; dest.x=x; dest.y=y; SDL_BlitSurface(protagonista, NULL, screen, &dest); } //Dibuja al bloque void DibujarBloque(int x, int y) { SDL_Rect dest; dest.x=x; dest.y=y; SDL_BlitSurface(bloque, NULL, 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 casilladel mapa[][]=25 hay colisión, se divide entre tam (tam=25) //porque 25 era el tamaño del cada pixel if ((keys[SDLK_UP]) && (mapa[(yHeroe-tam)/tam][(xHeroe)/tam]!=25)) { if ((mapa[(yBloque-tam)/tam][xBloque/tam] !=25) && (yHeroe-tam==yBloque && xHeroe==xBloque)) { yHeroe=yBloque;yBloque=yBloque-(tam); } else if(yHeroe-tam!=yBloque || xHeroe!=xBloque) yHeroe=yHeroe-(tam); } if ((keys[SDLK_DOWN]) && (mapa[(yHeroe+tam)/tam][(xHeroe)/tam]!=25)) { if ((mapa[(yBloque+tam)/tam][xBloque/tam] !=25) && (yHeroe+tam==yBloque && xHeroe==xBloque)) { yHeroe=yBloque;yBloque=yBloque+(tam); } else if(yHeroe+tam!=yBloque || xHeroe!=xBloque) yHeroe=yHeroe+(tam); } if ((keys[SDLK_LEFT]) && (mapa[(yHeroe)/tam][(xHeroe-tam)/tam]!=25)) { if ((mapa[(yBloque)/tam][(xBloque-tam)/tam] !=25) && (xHeroe-tam==xBloque && yHeroe==yBloque)) { xHeroe=xBloque;xBloque=xBloque-(tam); } else if(yHeroe!=yBloque || xHeroe-tam!=xBloque) xHeroe =xHeroe -(tam); } if ((keys[SDLK_RIGHT]) && (mapa[(yHeroe)/tam][(xHeroe+tam)/tam]!=25)) { if ((mapa[(yBloque)/tam][(xBloque+tam)/tam] !=25) && (xHeroe+tam==xBloque && yHeroe==yBloque)) { xHeroe=xBloque;xBloque=xBloque+(tam); } else if(yHeroe!=yBloque || xHeroe+tam!=xBloque) xHeroe =xHeroe +(tam); } } int main (int argc, char *argv[]) { int done = 0; char *msg; //Iniciando SDL if (SDL_Init (SDL_INIT_VIDEO) < 0) { sprintf (msg, "Error al inicializar SDL: %s\n", SDL_GetError ()); free (msg); exit (1); } atexit (SDL_Quit); //Iniciando pantalla screen = SDL_SetVideoMode (800, 600, 24, SDL_SWSURFACE | SDL_DOUBLEBUF); if (screen == NULL) { sprintf (msg, "No se puede establecer el mode de video: %s\n",SDL_GetError ()); free (msg); exit (2); } SDL_WM_SetCaption ("SDL MultiMedia Application", NULL); // Cargamos gráfico image = SDL_LoadBMP("Future.BMP"); if ( image == NULL ) { printf("No pude cargar grafico: %s\n", SDL_GetError()); system("pause"); exit(1); } //Cargamos heroe y bloque protagonista = SDL_LoadBMP("Dibujo.bmp"); bloque = SDL_LoadBMP("bloque.bmp"); // El protagonista debe tener contorno transparente SDL_SetColorKey(protagonista, SDL_SRCCOLORKEY, SDL_MapRGB(protagonista->format, 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); } DibujarHeroe(xHeroe,yHeroe); DibujarBloque(xBloque,yBloque); MoverHeroe(); //Actualizar pantalla SDL_Flip(screen); } return 0; }