XNA SpriteFont - diakritika

Tomáš Jecha, MVP, MCSD       05.11.2009       C#, VB.NET, Visual Studio       11705 zobrazení

Pokud se někdy dostanete do kontaktu s herním XNA enginem, je dost pravděpodobné, že mezi vaše přání bude patřit i vykreslování textů na obrazovku. XNA nabízí možnost použití tzv. spritefontů. Tedy písma, které se při kompilaci vyrenderuje a nás tak nemusí zajímat, zda je písmo na cílovém stroji nainstalováno (v případě Xboxu je to naprosto pochopitelné). Při vytvoření souboru spritefont do složky Content zjistíme, že se jedná o běžný XML soubor definující velikost, typ a rozsahy znaků, které se připraví při kompilaci do projektu.

Pokud se při základním nastavení pokusíte vyrenderovat diakritiku, příliš neuspějete. Implicitní rozsah zahrnutých znaků ji totiž neobsahuje. Získáte tuto chybu:

The character 'ř' (0x0159) is not available in this SpriteFont. If applicable, adjust the font's start and end CharacterRegions to include this character.
Název parametru: character

Připravil jsem proto seznam rozsahů, které zahrnou všechny “české” znaky v podobě malého i velkého písmene:

  <CharacterRegion><Start>&#193;</Start><End>&#193;</End></CharacterRegion> 

  <CharacterRegion><Start>&#268;</Start><End>&#268;</End></CharacterRegion> 

  <CharacterRegion><Start>&#270;</Start><End>&#270;</End></CharacterRegion> 

  <CharacterRegion><Start>&#201;</Start><End>&#201;</End></CharacterRegion> 

  <CharacterRegion><Start>&#282;</Start><End>&#282;</End></CharacterRegion> 

  <CharacterRegion><Start>&#205;</Start><End>&#205;</End></CharacterRegion> 

  <CharacterRegion><Start>&#327;</Start><End>&#327;</End></CharacterRegion> 

  <CharacterRegion><Start>&#211;</Start><End>&#211;</End></CharacterRegion> 

  <CharacterRegion><Start>&#344;</Start><End>&#344;</End></CharacterRegion> 

  <CharacterRegion><Start>&#352;</Start><End>&#352;</End></CharacterRegion> 

  <CharacterRegion><Start>&#356;</Start><End>&#356;</End></CharacterRegion> 

  <CharacterRegion><Start>&#218;</Start><End>&#218;</End></CharacterRegion> 

  <CharacterRegion><Start>&#366;</Start><End>&#366;</End></CharacterRegion> 

  <CharacterRegion><Start>&#221;</Start><End>&#221;</End></CharacterRegion> 

  <CharacterRegion><Start>&#381;</Start><End>&#381;</End></CharacterRegion> 

  <CharacterRegion><Start>&#225;</Start><End>&#225;</End></CharacterRegion> 

  <CharacterRegion><Start>&#269;</Start><End>&#269;</End></CharacterRegion> 

  <CharacterRegion><Start>&#271;</Start><End>&#271;</End></CharacterRegion> 

  <CharacterRegion><Start>&#233;</Start><End>&#233;</End></CharacterRegion> 

  <CharacterRegion><Start>&#283;</Start><End>&#283;</End></CharacterRegion> 

  <CharacterRegion><Start>&#237;</Start><End>&#237;</End></CharacterRegion> 

  <CharacterRegion><Start>&#328;</Start><End>&#328;</End></CharacterRegion> 

  <CharacterRegion><Start>&#243;</Start><End>&#243;</End></CharacterRegion> 

  <CharacterRegion><Start>&#345;</Start><End>&#345;</End></CharacterRegion> 

  <CharacterRegion><Start>&#353;</Start><End>&#353;</End></CharacterRegion> 

  <CharacterRegion><Start>&#357;</Start><End>&#357;</End></CharacterRegion> 

  <CharacterRegion><Start>&#250;</Start><End>&#250;</End></CharacterRegion> 

  <CharacterRegion><Start>&#367;</Start><End>&#367;</End></CharacterRegion> 

  <CharacterRegion><Start>&#253;</Start><End>&#253;</End></CharacterRegion> 

  <CharacterRegion><Start>&#382;</Start><End>&#382;</End></CharacterRegion>

Kód vložte za základní rozsahy v spritefont souboru:

spritefont file xna characterregions

Při vykreslování již žádné další problémy:

czech spritefont xna

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: XNA SpriteFont - diakritika

Zdravím,

já už jsem se před několika měsíci s touto záležitostí potýkal a zjistil metodou pokus / omyl a s pomocí tabulky znaků, že je nejjednodušší pro plnou podporu české diakritiky a dalších častých symbolů zapsat do souboru SpriteFontu toto:

    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#390;</End>
      </CharacterRegion>
    </CharacterRegions>

Podle mě je vaše řešení trochu složité, to moje zase obsahuje více znaků a bude tedy více zabírat i paměť...

Je ale užitečné, že jste článek zabývající se touto problematikou uveřejnil, protože když jsem hledal řešení na tuto záležitost, nic jsem nenašel (mimo jiné protože se anglicky mluvící většina internetu nezabývá problematikou národně specifických znaků)...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Moje řešení je složitější na první "vygenerování" - což už tady je naservírované. Vzal jsem prostě seznam českých znaků v tabulce unicode a pro ten jsem vygeneroval rozsahy. Je to čísté řešení a jeho použití v projektu následně složité není, pouze vkopírujete rozsahy do souboru s písmem. Při množství písem se tím ušetří nemalé množství paměti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: XNA SpriteFont - diakritika

Pěkné. Obdivuji, že se Ti chtělo zjišťovat všechny ty číselné kódy. Já vždy horní hranici toho defaultního rozsahu zvýšil na &#400; a bylo :-).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No vzhledem k tomu, že jsou ty kódy pro "české" znaky definované (takže vím, že tam žádný nechybí), tak to zas tak složité nebylo. A říkal jsem si, že by se to mohlo hodit i někomu dalšímu a to včetně mě, až to budu řešit znovu.

To zvýšení jsem dělal taky, ale pak jsem si usmyslel, že zkusím být trochu ohleduplný k prostředkům :-). Zvlášť při velkém počtu písem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback