SDL - 5 tipů a triků - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

SDL - 5 tipů a triků

sdl now

20. března 2002, 00.00 | V tomto článku si probereme tyto témata pod SDL:
Jak vykreslit pixel, Jak zobrazit font, Jak udělat výpis českého fontu, Jak nahrávat obrázky BMP, Jak skrýt kurzor myši.

Jak vykreslit pixel

Základní funkcí je vykreslení pixelu, to lze provést skrz ukazatel surface->pixels, který míří na začátek pole hodnot, kde jsou uloženy hodnoty všech pixelů daného SDL_Surface. Naše adresování závisí i na hloubce barev. 

SDL_Surface *surface;
int x,y;
Uint8 R,G,B;

//pro 16 bitovou hloubku barev
// Red=5,Green=6,Blue=5 bitu
*((Uint16 *)surface->pixels + y * surface->pitch/2 + x)=SDL_MapRGB(surface->format,R,G,B);

//pro 32 bitovou hloubku barev
// Red=8,Green=8,Blue=8
*((Uint32 *)surface->pixels + y * surface->pitch/4 + x)=SDL_MapRGB(surface->format,R,G,B);

//pro 8 bitovou hloubku barev
//paleta, funkce vraci index v palete pro nejblizsi barvu
*((Uint8 *)surface->pixels + y * surface->pitch + x)=SDL_MapRGB(surface->format,R,G,B);

Neuvádím zde příklad s hloubkou 24 bitů, neboť zde je výpis složitější a o mnoho pomalejší. 

Předtím než začneme přímo zapisovat pixely, musíme surface uzamknout a poté ho odemknout

//pokud surface potřebuje uzamknout, uzamkneme ho
if (SDL_MUSTLOCK(surface)) SDL_LockSurface( surface );

operace přímého přístupu k pixelům

pokud je třeba, tak surface odemkneme
if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface( surface );

na závěr ještě podotýkám, aby vykreslené pixely byly videt, je třeba oblast obrazovky, kam byly vykresleny odnovit.

obnoví celou obrazovku - u double surface modu prohodí přední a zadní surface
SDL_Flip(SDL_Surface *screen);

obnoví jen oblast vymezenou souřadnicemi, souřadnice musí odpovídat rozměrům obrazovky
SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Sint32 w, Sint32 h);

obnoví několik čtvercových oblastí, které jsou funkci předávány jako pole SDL_Rect
SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);

 

Jak zobrazit font

V každé hře většinou potřebujeme vypsat něco na obrazovku. SDL neobsahuje žádný výpis grafického fontu a obrazovku, a proto si musíme vypomoci nějakou unitou. V podstatě se dá říci, že fonty se ukládají rastrově (jako obrázek) nebo jako křivky (truetype fonty). U rastrových fontů se prakticky nedá měnit velikost (dají se sice zvětšovat i zmenšovat, ale dochází ke strátě informace, graficky se to projeví například rozmazáním), narozdíl od truetype fontů, jež lze libovolně zmenšovat/zvětšovat. Truetype fonty mají, ale nepříjemnou vlastnost a to je pomalost jejich výpisu, jsou o hodně náročnější na výkon procesoru.

Nám obyčejně stačí rychlé rastrové fonty. Hezkou a jednoduchou unitou na jejich výpis je SFont. Font je zapsán jako obrázek vysoký jako jedno písmeno a široký tak, že pojme písmena od znaku "!" až po znak "~". Na první řadce jsou fialovou barvou (255,0,255) vyznačeny mezery mezi písmeny, písmena proto mohou mít různou šířku.

Unitu SFont naleznete na strankách www.libsdl.org. SFont obsahuje tyto funkce:

void InitFont (SDL_Surface *Font);
inicializuje defaultní font, inicializace probíhá tak, že se podle klíčové barvy určí začátky a konce písmen v surfacu.

void PutString (SDL_Surface *Surface, int x, int y, char *text);
pomocí této funkce se vypisuje na obrazovku

void XCenteredString (SDL_Surface *Surface, int y, char *text);
tato funkce vypisuje text centrovaný na pozici x

int TextWidth(char *text);
tato funkce vrací délku zadaného textu

void SFont_Input ( SDL_Surface *Destination, int x, int y, int Width, char *text);
pomocí této funkce lze načíst text z klávesnice, width je maximální délka textu a text je zadaný řetězec

Tyto funkce jsou obdoby předchozích pouze s tím rozdílem, že můžeme zvolit libovolný font pro výpis a ne jen defaultní.

void InitFont2(SFont_FontInfo *Font);
k této funkci je třeba podotknout, že před inicializaci musí být ve Font->Surface uložen surface s fontem

void PutString2(SDL_Surface *Surface, SFont_FontInfo *Font, int x, int y, char *text);

void XCenteredString2(SDL_Surface *Surface, SFont_FontInfo *Font, int y, char *text);

int TextWidth2(SFont_FontInfo *Font, char *text);

void SFont_Input2( SDL_Surface *Destination, SFont_FontInfo *Font, int x, int y, int Width, char *text);

Jak udělat výpis českého fontu

s předchozími funkcemi lze poměrně dobře vypisovat anglické fonty, pokud ale chceme výpis českého fontu musíme si vypomoci sami. Do souboru SFont.cpp vložíme tento kus kódu

char *cesky="ěščřžýáíéďňóťúůĚŠČŘŽÝÁÍÉĎŇÓŤÚŮ\n";

Uint8 preklad(char znak)
{
int x=0;
if (znak<=126) return znak;
while (cesky[x]!='\n') if (znak==cesky[x++]) return(126+x);
return znak;
}

potom řádek v PutString2

ofs=(text[i]-33)*2+1;

nahradíme tímto

ofs=(preklad(text[i])-33)*2+1;

a naše čeština je kodovaná, nesmíme ovšem zapomenout "dopsat" česká písmena na konec surfacu fontu a mezery mezi nimi zvýraznit fialovou barvou. Zde si mužete stáhnout mnou upravenou verzi unity SFont s jedním fontem bez velkých českých písmen. Pokud potřebujete podobný font neměl by být problém ho podle tohoto vzoru vytvořit. Dále je k SFontu přidána funkce

int PutStringDown(SDL_Surface *screen,SFont_FontInfo *font,int x,int y,char *text);

která bere znak '|' v textu jako signál k přechodu na další řádek a vrací výšku vypsaného textu.

upravený SFont (36KB)

Jak nahrávat obrázky BMP

SDL umí pomocí funkce 

SDL_Surface *SDL_LoadBMP(const char *file);

nahrávat formát BMP, pokud chceme jíný formát musíme si vypomoct třeba unitou SDL_image, kterou probereme v nějakém dalším pokračování..

 

Jak skrýt kurzor myši

Nakonec jsem si nechal to nejjednodušší, ke skrytí kurzoru myši slouží funkce

SDL_ShowCursor(int);

Pokud je parametr 0 kurzor se nevykresluje, při jiné hodnotě se kurzor vykreslí (standartně 1). Pokud kurzor skryjeme můžeme pomocí obrázku vykreslovat vlastní barevný kurzor, který může být třeba animovaný ;-))

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: