Povídání o tvorbě herních enginů a představení RetroRPG Engine.

Na začátku jsem zmínil, že jazykem projektu je C#. Mnozí z vás tedy asi nabyli dojmu, že vykreslování bude probíhat na vestavěné třídě konzole. Na začátku jsem si to myslel taky, nicméně třída console má mnoho nedostatků, které znemožňují její použití pro komplexní rendrování:

  • Při zavolání metody clear (vyčištění obrazovky) konzole problikne. Nekoukatelné.
  • Line-oriented přístup. Na kreslících metodách se jako parametr předává pouze text, pro herní vývoj potřebujeme ke konzoli přistupovat jako k 2D mřížce, kde můžeme kreslit na libovolnou souřadnici.
  • Velmi nízká rychlost.
  • Pro texty je potřeba speciální značení, které umožní barevné oddělení slov, efekty při výpisu.

Proto vznikla třída buffer – dvojitá vyrovnávací paměť pro konzoli. Veškerý vykreslený (draw_ deriváty) text se ukládá do bufferu a k jeho vykreslení na obrazovku dojde až po zavolání metody print. Povídání o tom, jak taková dvojitá vyrovnávací paměť funguje,  P/Invoke a čtení/psaní do IO proudu přesahuje rámec tohoto článku. Důležité je, že konzole nebliká. Pomocí metody DrawColored se dá vykreslovat text s komplexními metatagy, jak ukazuje následující obrázek:

Bezejmenný

To nás přivádí k tomu, jak takovýto text psát. Potřebujeme nástroj, ve kterém budeme v reálném čase vidět výsledek a po kliknutí se vyexportuje text se značením.

Bezejmenný

Ve složce projektu se objeví soubor output.txt s výsledným textem:

Bezejmenný

Vrátím se k obrázku, popisujícímu povolání barbar. Určitě nechceme sekeru pracně hardcodit v kódu aplikace. Mnohem lepším řešením je obrázek uložit a následně naparsovat:

Bezejmenný

K tomu budeme potřebovat vhodné metody na třídě parser. Volání načtení obrázku pak může vypadat třeba takto:

Parser.getInstance.parseImage(ResourceTree.graphicsZodiac + „/aries.txt“, false, ConsoleColor.Gray, Parser.Effects.none);

Kde na prvním parametru je soubor k načtení, následuje možnost zda obrázek zacentrovat (bool), barva obrázku, efekt načtení. Při implementaci těchto funkcí je důležité myslet na pohodlí uživatele. Libovolné parametry a přetěžování metod je dobrým základem. Zde kupříkladu je žádoucí, aby uživatel dostal naparsovaný obrázek už pouze po zadání prvního parametru. Například řešení  GameMakeru pro vykreslování pomocí funkcí:

draw_sprite, draw_sprite_ext, draw_sprite_tiled, draw_sprite_general...

Je značně neoptimální. Vždy je lepší reagovat na dat. typ parametru (při podobné funkcionalitě), který dostaneme, než tvořit další metodu.