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.
|
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
|
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):
- SDL - profesionální hry jednoduše a snadno
- SDL a šetřič obrazovky
- SDL - 5 tipů a triků
- Mandelbrotova množina a jak na ní
- SDL_mixer - zvuky a hudba jednoduše a snadno
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007