[Předchozí] Obsah [Další]

Použití Simple DirectMedia Layer API

Grafika

  • Volba a nastavení videorežimů (snadnou cestou)

    Jenom si zvolíte svou oblíbenou bitovou hloubku a rozlišení a nastavíte je!

Tip #1:
Bitovou hloubku, se kterou váš hardware pracuje nejrychleji, zjistíte pomocí funkce SDL_GetVideoInfo().

Tip #2:
Seznam podporovaných rozlišení pro konkrétní bitovou hloubku můžete získat použitím funkce SDL_ListModes().

Příklad:
{ SDL_Surface *screen;

    screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if ( screen == NULL ) {
        fprintf(stderr, "Není možné nastavit videorežim 640x480: %s\n", SDL_GetError());
        exit(1);
    }
}
  • Kreslení bodů na obrazovku

    Kreslení bodů na obrazovku se provede přímým zápisem do obrazové paměti a zavoláním funkce pro update obrazovky.

Tip:
Pokud víte, že budete na obrazovce vykreslovat hodně prvků, je nejlepší metoda uzamknout obrazovku (pokud je to nutné) jednou před zápisem do obrazové paměti, kreslit a uchovávat seznam oblastí, které bude potřeba updatovat, a znovu odemknout obrazovku, než ji obnovíte.
Příklad:

Vykreslení bodu na obrazovce v libovolném formátu

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: { /* Předpokládáme 8 bitů na pixel */
            Uint8 *bufp;

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

        case 2: { /* Pravděpodobě 15 bitů na pixel nebo 16 bitů na pixel */
            Uint16 *bufp;

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

        case 3: { /* Pomalý mód 24 bitů na pixel, obvykle nepoužívaný */
            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: { /* Pravděpodobně 32 bitů na pixel */
            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);
}
  • Načtení a zobrazení obrázků

    SDL nabízí pro vaše pohodlí rutinu pro načtení jednoho obrázku - SDL_LoadBMP(). Knihovnu pro načítání obrázků můžete najít v archivu s SDL demy.

    Obrázky můžete zobrazit za pomoci SDL_BlitSurface() jejich zkopírováním do obrazové paměti. SDL_BlitSurface() automaticky ořízne kopírovaný obdélník, který pak můžete předat funkci SDL_UpdateRects(), aby updatovala změněnou část obrazovky.

Tip #1:
Pokud načtete obrázek, který se pak bude zobrazovat mnohokrát, máte možnost zrychlit jeho kopírování konverzí obrázku do formátu obrazovky. Funkce SDL_DisplayFormat() provádí právě tuto konverzi.

Tip #2:
Hodně spritů má průhledné pozadí. Můžete povolit kopírování s ohledem na průhlednost (tzv. colorkey blit) pomocí funkce SDL_SetColorKey().

Příklad:
void ShowBMP(char *file, SDL_Surface *screen, int x, int y)
{
    SDL_Surface *image;
    SDL_Rect dest;

    /* Načtení souboru ve formátu BMP do vrstvy */
    image = SDL_LoadBMP(file);
    if ( image == NULL ) {
        fprintf(stderr, "Nepodařilo se načíst %s: %s\n", file, SDL_GetError());
        return;
    }

    /* Zkopírovat do vrstvy obrazovky.
       V tomto případě by se vrstvy neměly zamykat.
     */
    dest.x = x;
    dest.y = y;
    dest.w = image->w;
    dest.h = image->h;
    SDL_BlitSurface(image, NULL, screen, &dest);

    /* Updatovat změněnou část obrazovky */
    SDL_UpdateRects(screen, 1, &dest);
}

[Předchozí] Obsah [Další]