|
[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ší]
|