[Anterior] Tabla De Contenido [Siguiente]

Usando la API de Simple DirectMedia Layer

Vídeo

  • Eligiendo y estableciendo modos de vídeo (la manera fácil)

    Simplemente escoges tu modo de resolución y profundidad de color preferido y, ¡lo estableces!

Pista #1:
Puedes encontrar los modos de vídeo más rápidos soportados por el hardware con la función SDL_GetVideoInfo().

Pista #2:
Puedes obtener una lista de resoluciones de vídeo soportadas para una determinada profundidad de color usando la función SDL_ListModes().

Ejemplo:
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) 
    {
        fprintf(stderr, "No se puede establecer el modo \
                de video 640x480: %s\n", SDL_GetError());
        exit(1);
    }
}
  • Dibujando píxels en la pantalla

    Para dibujar en la pantalla debemos escribir directamente en el búfer de marco (framebuffer) gráfico, y llamar a la función de actualización de pantalla.

Pista:
Si sabes que vas a realizar mucho dibujo, es mejor cerrar la pantalla (si es necesario) una vez antes de pintar, dibujar mientras mantienes una lista de areas que necesitan ser actualizadas, y abrir la pantalla de nuevo antes de actualizar el dispositivo de visualización.
Ejemplo:

Dibujando un píxel en la pantalla de un formato arbitrario

void DrawPixel(SDL_Surface *screen, Uint8 R, Uint8 G, Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    if ( SDL_MUSTLOCK(screen) ) 
    {
        if ( SDL_LockSurface(screen) < 0 ) 
	{
            return;
        }
    }
    switch (screen->format->BytesPerPixel) 
    {    
        case 1: 
	{ /* Asumimos 8-bpp */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: 
	{ /* Probablemente 15-bpp o 16-bpp */
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + \
	           y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: 
	{ /* Modo lento 24-bpp, normalmente no usado */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *(bufp+screen->format->Rshift/8) = R;
            *(bufp+screen->format->Gshift/8) = G;
            *(bufp+screen->format->Bshift/8) = B;
        }
        break;

        case 4: 
	{ /* Probablemente 32-bpp */
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + \ 
                   y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }
    if ( SDL_MUSTLOCK(screen) ) 
    {
        SDL_UnlockSurface(screen);
    }
    SDL_UpdateRect(screen, x, y, 1, 1);
}
  • Cargar y mostrar imágenes

    SDL facilita una única rutina de carga de imágenes para tu conveniencia, SDL_LoadBMP(). Puedes encontrar una librería para la carga de imágenes en el archivo de demos SDL.

    Puedes mostrar imágenes usando SDL_BlitSurface() para volcarlas en búfer de marco gráfico. SDL_BlitSurface() recorta automáticamente el rectángulo volcado, que debería ser pasado a SDL_UpdateRects() para actualizar la porción de la pantalla que ha cambiado.

Pista #1:
Si estás cargando una imagen que se va a mostrar varias veces, puedes acelerar la velocidad de volcado convirtiéndola al formato de la pantalla. La función SDL_DisplayFormat() realiza esta conversión por tí.

Pista #2:
Muchas imágenes de sprite tienen un fondo transparente. Puedes habilitar volcados transparentes (volcados con color clave) mediante la función SDL_SetColorKey().

Ejemplo:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;

    /* Cargamos el archivo BMP en la superficie */
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "No pude cargar %s: %s\n", 
	        file, SDL_GetError());
        return;
    }

    /* Volcamos en la superficie de pantalla.
       Las superficies no deberían estar bloqueadas 
       en este punto. */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /* Actualizamos la porcion de pantalla que ha cambiado */
    SDL_UpdateRects(screen, 1, &dest);

    SDL_FreeSurface(image);
}

[Anterior] Tabla De Contenido [Siguiente]