Dos códigos, dos simples mains, uno cargo una imagen bmp en pantalla y el otro más de lo mismo, base para todo videojuego que pueda hacer y que se honre con tal nombre. Hasta ahora no tengo nada que lleve ese nombre.
Peeero, estos códigos son imprescindibles para mi camino a recorrer. ^^
Lo único a tener en cuenta en el código es la ruta hacia la imagen que se muestra, que debe ser si o si bmp. (Según la definición del método, tampoco he probado).
main.c: Pulsa para ver/ocultar el código
#include <stdio.h> #include <SDL/SDL.h> //método auxiliar que uso SDL_Surface *inicializacion(); int main(){ //pantallas que uso SDL_Surface *pantalla, *imagen; //donde dibujaré SDL_Rect destino; //inicializo pantalla=inicializacion(); if (pantalla == NULL) { printf("Error iniciando el entorno gráfico: %s\n", SDL_GetError()); exit(1); } //cargo la imagen imagen = SDL_LoadBMP("images/sasuke.bmp"); if(imagen==NULL){ printf("Error al cargar la imagen: %s\n", SDL_GetError()); exit(0); } // Guardamos el BMP con otro nombre if (SDL_SaveBMP(imagen, "images/sasuke2.bmp") == -1){ printf("No se puede guardar la imagen\n"); } // Inicializamos la variable de posición y tamaño de destino destino.x = 250; destino.y = 150; destino.w = imagen->w; destino.h = imagen->h; // Copiamos la superficie creada rectángulo en la anterior pantalla SDL_BlitSurface(imagen, NULL, pantalla, &destino); // Mostramos la pantalla SDL_Flip(pantalla); // Ya podemos liberar el rectángulo, una vez copiado y mostrado SDL_FreeSurface(imagen); SDL_Delay(5000); exit(0); } SDL_Surface *inicializacion(){ SDL_Surface *pantalla; if(SDL_Init(SDL_INIT_VIDEO)<0){ printf("No se pudo iniciar SDL: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); if(SDL_VideoModeOK(1024,768,24,SDL_SWSURFACE|SDL_DOUBLEBUF)==0){ printf("Modo no soportado: %s\n", SDL_GetError()); exit(1); } //saco la pantalla pantalla=SDL_SetVideoMode(1024, 768, 24, SDL_SWSURFACE|SDL_DOUBLEBUF); if (pantalla == NULL) { printf("Error iniciando el entorno gráfico: %s/n", SDL_GetError()); exit(1); } return pantalla; }
El otro código es el mismo main pero añadiendo el manejo del color key, siendo el magenta el que usé en mi imagen.
main.c: Pulsa para ver/ocultar el código
#include#include SDL_Surface *inicializacion(); int main(){ SDL_Surface *pantalla, *imagen; SDL_Rect destino; //inicializo pantalla=inicializacion(); if (pantalla == NULL) { printf("Error iniciando el entorno gráfico: %s\n", SDL_GetError()); exit(1); } imagen = SDL_LoadBMP("images/sasuke.bmp"); if(imagen==NULL){ printf("Error al cargar la imagen: %s\n", SDL_GetError()); exit(0); } // Inicializamos la variable de posición y tamaño de destino destino.x = 250; destino.y = 150; destino.w = imagen->w; destino.h = imagen->h; //aplico transparencia Uint32 color=SDL_MapRGB(imagen->format, 255, 0, 255); SDL_SetColorKey(imagen, SDL_SRCCOLORKEY|SDL_RLEACCEL, color); // Copiamos la superficie creada rectángulo en la anterior pantalla SDL_BlitSurface(imagen, NULL, pantalla, &destino); // Mostramos la pantalla SDL_Flip(pantalla); // Ya podemos liberar el rectángulo, una vez copiado y mostrado SDL_FreeSurface(imagen); SDL_Delay(5000); exit(0); } SDL_Surface *inicializacion(){ SDL_Surface *pantalla; if(SDL_Init(SDL_INIT_VIDEO)<0){ printf("No se pudo iniciar SDL: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); if(SDL_VideoModeOK(1024,768,24,SDL_HWSURFACE|SDL_DOUBLEBUF)==0){ printf("Modo no soportado: %s\n", SDL_GetError()); exit(1); } //saco la pantalla pantalla=SDL_SetVideoMode(1024, 768, 24, SDL_SWSURFACE|SDL_DOUBLEBUF); if (pantalla == NULL) { printf("Error iniciando el entorno gráfico: %s/n", SDL_GetError()); exit(1); } return pantalla; }