[Precedente] Contenuti [Successivo]

Usare la Simple DirectMedia Layer API

Video

  • Scegliere il modo video (il metodo facile)

    Semplicemente, si sceglie la risoluzione e la profondita' di colore desiderata, e le si setta!

Suggerimento #1:
E' possibile trovare la profondita' di colore piu' veloce sopportata dall'hardware con la funzione SDL_GetVideoInfo().

Suggerimento #2:
E' possibile ottenere una lista delle risoluzioni video supportate per una specifica profondita' di colore mediante la funzione SDL_ListModes().

Esempio:
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) {
        fprintf(stderr, "Impossibile usare il modo 640x480: %s\n",
                 SDL_GetError());
        exit(1);
    }
}
  • Disegno di pixel sullo schermo

    Il disegno diretto sullo schermo e' eseguito scrivendo in modo diretto sul framebuffer grafico, e chiamando successivamente la funzione di aggiornamento del video.

Suggerimento:
Se si sa che l'applicazione fara' uso intensivo del disegno su schermo, e' opportuno bloccare lo schermo (se necessario) prima di iniziare un disegno, effettuare il disegno tenendo una lista di aree che dovranno essere aggiornate, e sbloccare lo schermo prima di aggiornare il display.
Esempio:

Disegno di un pixel su uno schermo di formato arbitrario

#include <SDL_endian.h> /* Used for the endian-dependent 24 bpp mode */

void DrawPixel(SDL_Surface *screen, int x, int y,
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: { /* Assumiamo 8-bpp */
            Uint8 *bufp;

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

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

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

        case 3: { /* Lento modo a 24-bpp, di solito non usato */
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
            if(SDL_BYTEORDER == SDL_LIL_ENDIAN) {
                bufp[0] = color;
                bufp[1] = color >> 8;
                bufp[2] = color >> 16;
            } else {
                bufp[2] = color;
                bufp[1] = color >> 8;
                bufp[0] = color >> 16;
            }
        }
        break;

        case 4: { /* Probabilmente 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);
}
  • Caricamento e visualizzazione di immagini

    SDL fornisce una sola funzione di caricamento delle immagini, SDL_LoadBMP(). Una libreria di funzioni per caricare vari tipi d'immagine puo' essere trovata nell'archivio SDL demo.

    E' possibile visualizzare immagini usando la funzione SDL_BlitSurface() per copiare un'immagine su un framebuffer grafico. SDL_BlitSurface() adatta in modo automatico il rettangolo di visualizzazione che dovrebbe poi essere passato a SDL_UpdateRects() per specificare le porzioni di schermo che devono essere aggiornate.

Suggerimento #1:
Se si e' caricata un'immagine che verra' mostrata molte volte, e' possibile migliorare le prestazioni del blit convertendo l'immagine al formato attuale dello schermo. La funzione SDL_DisplayFormat() esegue questa conversione.

Suggerimento #2:
Molte immagini usate come sprite hanno il background trasparente. E' possibile abilitare i blit trasparenti (con colore chiave) con la funzione SDL_SetColorKey().

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

    /* Carica un file BMP su una superficie */
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "Impossibile caricare %s: %s\n", 
               file, SDL_GetError());
        return;
    }

    /* Copia sulla superficie dello schermo
       La superficie dovrebbe essere bloccata a questo punto.
     */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /* Aggiorna la parte di schermo che e' stata cambiata */
    SDL_UpdateRects(screen, 1, &dest);
}

[Precedente] Contenuti [Successivo]