5. díl - SDL - Vykreslení textu

C++ SDL SDL - Vykreslení textu

V dnešním díle se podíváme na vykreslování textu v SDL. Protože vykreslování textu není zabudované v SDL, budeme muset použít opět jedno z rozšíření. Tentokrát to bude SDL_ttf. Stáhneme vývojářskou verzi pro Visual Studio. Stejně jako pro SDL a SDL_Image, přidáme složky include a lib/x64 do „*Include Directories*“ a „*Library Directories*“. Přidáme knihovnu SDL_ttf.lib a nezapomene nakopírovat všechny dynamické knihovny (.dll soubory) do složky Output. Nyní bychom měli být schopní includovat soubor SDL2_ttf.h. Na začátek souboru přidáme tentokrát TTF_Init a na konec TTF_Quit. Jestliže jsme všechno udělali správně, projekt by měl jít stále bez problémů spustit. Dokumentace ke knihovně je dostupná zde.

Práce s fonty v rozšíření SDL_ttf

Abychom mohli vyzkoušet práci s fonty, musíme mít font, na kterém budeme aplikaci testovat. Já jsem zvolil Playfair font. Ve složce projektu vytvoříme novou složku Fonts, do které soubory nakopírujeme. Opět v Pre-build Events nastavíme, aby se nám složka zkopírovala do složky výstupní.

K otevření souboru máme jednoduchou funkci TTF_OpenFont. Ta otevře soubor s fontem (podporuje TTF a OTF) a nastaví mu velikost zadanou druhým parametrem. Pozor, tato velikost neudává výšku v pixelech. Obdobnou funkcí je SDL_OpenFontIn­dex, která otevře soubor a v něm face font, který je zadaný posledním parametrem. Nyní se už zpravidla dávají různé face fonty do samostatných souborů, proto funkci moc nevyužijeme. K oběma těmto funkcím jsou jejich ekvivalenty, které pracují s SDL_RWops strukturou. Jak jsme si řekli, ta slouží jako abstrakce operací se soubory. O těchto funkcích si řekneme víc, až budeme tuto abstrakci znát.

Stejně jako všechny ostatní struktury v SDL. I TTF_Font musíme uvolnit. Slouží k tomu funkce TTF_CloseFont.

Vykreslení textu

Pro vykreslování textu máme prakticky tři funkce, každá má ale čtyři různé variace pro rozdílné kódování. Funkce rozlišují klasický ASCII text, dále UNICODE a UTF8. Čtvrtá variace slouží pro vykreslení jediného UNICODE znaku (Glyph).

Ony tři funkce jsou TTF_RenderTex­t_Solid, TTF_RenderTex­t_Shaded a TTF_RenderTex­t_Blended. Text můžeme vždy nahradit jednou z výše zmíněnou variací, proto máme také například TTF_RenderUTF8_Solid. Všechny funkce nalezneme v dokumentaci. O rozdílu těchto tří funkcí nejlépe vypovídá následující obrázek.

Rozdílné variace

Solid je orientovaný na výkon, ale nevypadá tak dobře. SDL, jak nejrychleji to dokáže, vykreslí text do SDL_Surface, který vrátí. Naproti tomu Blended využívá i transparentnosti (ne všechny pixely jsou plně viditelné) a tak se zdá, že jsou kraje lépe zaoblené. Samozřejmě zároveň s tím roste čas, který SDL potřebuje k vytvoření SDL_Surface s textem. Poslední případ je Shaded, který je vlastně stejný jako Blended, pouze mu jako poslední parametr přidáme barvu pozadí, kterou vykreslí zároveň s textem. Tato aplikace bude přibalena pod článkem.

Atributy textu

Některé atributy textu můžeme nastavit, některé jsou pouze ke čtení. Nejprve zmíníme ty, které nastavit můžeme, protože s těmi budeme pracovat nejčastěji. Poté zmíním ostatní funkce.

Mezi nejdůležitější funkci bude patřit bezesporu TTF_SetFontStyle. Touto funkcí nastavujeme styly jako TTF_STYLE_BOLD nebo TTF_STYLE_ITALIC - tučné písmo nebo kurzíva. Všechny možnosti jsou uvedeny v dokumentaci. Další funkcí, kterou budeme potřebovat, je TTF_SetFontOu­tline. Jestliže nastavíme Outline na 0, bude se písmo barvou vyplňovat. Jakákoliv jiná kladná hodnota značí tloušťku čáry, kterou bude písmo obtaženo. Na následujícím obrázku vidíme efekt, kdy je Outline nastavena na 4.

Outline demo

Nastavit můžeme i tzv. hinting. Hinting především „doostřuje“ písmo tím, že zlepší kontrast jeho okrajů. Hinting je důležitý především pro displeje s nízkým rozlišením. Větší rozbor této technologie je mimo obsah tohoto seriálu, proto odkáži na Wikipedii. Další věc, kterou můžeme nastavit, je font kerning. Kerning je přesahování znaku znakem novým. Opět odkáži na Wikipedii.

Dále tu máme funkce pro zjišťování informací o fontu. Můžeme získat počet font faces (TTF_FontFaces), jestli je šířka každého písmena stejná (TTF_FontFace­IsFixedWidth) – tzv. monospaced písmo. Používá se například v příkazové řádce nebo zde na síti v ukázkách kódu. Dále můžeme zjistit, jak se jmenuje rodina jazyků (TTF_FontFace­FamilyName) a název aktuální font face (TTF_FontFaces­StyleName). Můžeme vidět, že jsou to funkce, které často v aplikaci (ve hře) využívat nebudeme. Poslední dvě funkce jsou ale o něco užitečnější. První funkce je TTF_GlyphIsPro­vided, která vrací 0, pokud zadaný znak font nedokáže vykreslit. Poslední funkce je TTF_GlyphMetrics, která vrací údaje o velikosti zadaného znaku. Než vysvětlovat jednotlivé body, opět přesměruji na dokumentaci, kde je i ukázkový obrázek, který jednotlivé pojmy vysvětluje. Tyto funkce použijeme hlavně ve chvíli, kdy chceme znak nebo řetězec umístit přesně na určité místo a rozhodují pixely.

Poslední skupina funkcí, které probereme, je podobná těm vykreslovacím. Opět je samostatná funkce pro Text, UNICODE i pro UTF8. Jedná se o funkci Size (TTF_SizeText), která vrací velikost SDL_Surface, která by byla potřeba pro daný text. Žádné vykreslování se ovšem nekoná, proto je funkce efektivnější než kdybychom písmo vykreslili a poté zjišťovali velikost SDL_Surface. Pokud nepotřebujeme text dále nikde vykreslit, ale pouze zjistit místo, které zabere, použijeme právě tuto funkci (například při plánování rozvržení).

Pro dnešní díl je to vše. V tom příštím se hlouběji ponoříme do práce s SDL_Surface a to včetně přímé manipulace s pixely.


 

Stáhnout

Staženo 149x (9.55 MB)

 

  Aktivity (1)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
SDL - Práce s obrázky
Miniatura
Všechny články v sekci
SDL
Miniatura
Následující článek
SDL - Práce s 8bitovou grafikou

 

 

Komentáře

Avatar
fstrapko
Člen
Avatar
fstrapko:

V prvom odseku je chyba. Treba includovať súbor "SDL_ttf.h" a nie "SDL2_ttf.h". :)

 
Odpovědět 19.12.2015 0:55
Avatar
fstrapko
Člen
Avatar
Odpovídá na fstrapko
fstrapko:

A namiesto SDL_ttf.lib pridať knižnicu SDL2_ttf.lib (ak používame verziu 2 :) ).

 
Odpovědět 21.12.2015 12:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.