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

