Fandom

Scratchpad

Funciones basicas de SDL(base)

215,800pages on
this wiki
Add New Page
Discuss this page0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Añadir la libreria a la cabecera

Para poder empezar a usar la libreria SDL necesitamos colocar su cabecera. Esta suele ser:

#include "SDL.h"

Un ejemplo de cabecera:

 #include <stdlib.h> 
 #include "SDL.h" 

Inicializar la librería SDL

Utilizaremos la función SDL_init(Uint32 flags) Este unit32 puede tomar diferentes parametros, como pueden ser: SDL_INIT_VIDEO , SDL_INIT_AUDIO , SDL_INIT_TIMER , SDL_INIT_CDROM , SDL_INIT_JOYSTICK , SDL_INIT_EVERYTHING

Estos parametros se pasan separados mediante una barra vertical |

Un ejemplo de inicio de una cabecera:

main()
{ 
    if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)< 0)      { 
        printf("No se puede iniciar SDL: %s\n",SDL_GetError()); '''Bold text'''
        exit(1); 
    } 
    atexit(SDL_Quit); 
} 

Establecer el modo de video (SDL_SetVideoMode())

Esto se realiza mediante la funcion SDL_SetVideoMode() Esta funcion tiene la siguiente forma:

  SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags) 

Los parámetros witdth y height son la anchura y la altura de la superficie en píxeles. Con el parámetro bpp le indicamos a SDL cuántos bits por pixels queremos establecer, es decir, la profundidad de color. Valores típicos son 8, 16, 24 y 32.
El último parámetro son los flags, que es un campo de bits. Puede tomar diferentes valores y significados:

 - SDL_SWSURFACE  Crea la superficie de vídeo en la memoria principal 
 - SDL_HWSURFACE  Crea la superficie en la memoria de vídeo. 
 - SDL_ASYNCBLIT  Modo de blit asíncrono. 
 - SDL_ANYFORMAT  Fuerza el uso de los bpp de la surface actual. Hay que 
 usarlo cuando queramos crear la superficie en una ventana. 
 - SDL_HWPALETTE  Da a SDL acceso exclusivo a la paleta de color.  
 - SDL_DOUBLEBUF  Sólo válido con SDL_HWSURFACE. Permite el uso del doble buffer. 
 - SDL_FULLSCREEN Intenta poner el modo a pantalla completa. 
 - SDL_OPENGL     Crea un contexto OpenGL en la superficie. 
 - SDL_OPENGLBLIT Igual que la anterior, pero permite que SDL haga el render 2D. 
 - SDL_RESIZABLE  Crea un ventana que puede cambiar de tamaño. 
 - SDL_NOFRAME  Crea una ventana pero sin borde. 

Un ejemplo de inicializacion de video:

SDL_Surface *screen; 
 
screen = SDL_SetVideoMode(640,480,24,SDL_SWSURFACE| SDL_DOUBLEBUF); 
if ( screen == NULL ){ 
    fprintf(stderr, "No se puede establecer el modo \ 
            de video 640x480: %s\n", SDL_GetError());   
 exit(1); 
} 

- Utilizacion de superficies intermedias

Ademas de inicializar el modo de video, es seguro que necesitaremos crear y utilizar superficies intermedias para almacenar gráficos, construir escenas, etc...
Para esto utilizaremos la función SDL_CreateRGBSurface
El formato de esta funcion es:

  SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, 
  int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);

Los parámetros width y height tienen el mismo significado que en SDL_SetVideoMode, y depth es lo mismo que bpp.
Los valores para flag pueden ser:

  SDL_SWSURFACE  Crea la superficie de vídeo en la memoria principal
  SDL_HWSURFACE  Crea la superficie en la memoria de vídeo. 
  SDL_SRCCOLORKEY Permite el uso de transparencias (color key). 
  SDL_SRCALPHA  Activa el alpha-blending. 

Un ejemplo del uso de la funcion de superficie:

rmask = 0xff000000; 
gmask = 0x00ff0000; 
bmask = 0x0000ff00; 
amask = 0x000000ff; 
surface = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480, 24,rmask, gmask, 
bmask, amask); 
if(surface == NULL) { 
    printf("Error al crear la superficie"); 
    exit(1); 
} 

Cargar graficos (SDL_LoadBMP())

La funcion para cargar una imagen es: SDL_LoadBMP() El formato de la función es el siguiente:

  SDL_Surface *SDL_LoadBMP(const char *file);

Sólo tiene un parámetro, que es el nombre (y path) del un fichero gráfico en formato .bmp. Si la función tiene éxito nos devuelve una superficie del tamaño del gráfico que acabamos de cargar, si no, devuelve NULL.

Mostrar el grafico en pantalla (SDL_BlitSurface())

La siguiente funcion que debemos usar sirve para cargar el grafico en pantalla, basicamente copia zonas rectangulares de una superficie a otra.La funcion es: SDL_BlitSurface()
El formato de esta función es el siguiente:

  int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface 
  *dst, SDL_Rect *dstrect);

En esta funcion podemos encontrar los diferentes parametros: dos de tipo SDL_Surface y otros dos de tipo SDL_Rect.

SDL_Rect

El primer tipo ya lo conocemos, en concreto son los parámetros src y dst, que son la superficie fuente y la de destino respectivamente. El parámetro srcrect define la zona rectangular de la superficie desde la que queremos copiar. Dstrect es la zona rectangular de la superficie de destino en la que vamos a copiar elgráfico. SDL_Rect tiene la siguiente forma:

 typedef struct{
 Sint16 x, y;
 Uint16 w, h;
 } SDL_Rect;

Y a continuacion un ejemplo basico:

SDL_Rect dest;
dest.x = 100;
dest.y = 100;
dest.w = image->w;
dest.h = image->h;
SDL_BlitSurface(image, NULL, screen, &dest);

SDL_FillRect

SDL_FillRect Es otra utilidad de la estructura SDL_Rect y sirve para dibujar rectángulos en la pantalla. El formato de la función es:

  int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);

Y un ejemplo seria: (borra la pantalla)

SDL_Rect dest;
dest.x = 0;
dest.y = 0;
dest.w = screen->w;
dest.h = screen->h;
SDL_FillRect(screen,&dest,SDL_MapRGB(screen->format,0,0,0));

SDL_Flip

Esta funcion se encarga de intercambiar buffers, es decir cambiar el contenido del buffer secundario al principal. El formato de la funcion es:

  int SDL_Flip(SDL_Surface *screen);

SDL_FreeSurface

Esta funcion sirve para liberar la superficie que contiene la imagen cargada Su formato es:

  void SDL_FreeSurface(SDL_Surface *surface);

Efectos especiales: Transparencias(SDL_SetColorKey)

La siguiente funcion nos permite designar un color en la superficie, que pasamos como parámetro, y que tendrá el comportamiento de un color transparente. El formato de esta función es:

  int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);

Un ejemplo seria: (Transformaria el rojo puro a transparente)

SDL_SetColorKey(image, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(image-
>format,255,0,0));

Also on Fandom

Random wikia