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

Když jsme u parsování obrázků – proč nepřidat podporu parsování animovaných obrázků? Základem je vždy vymyšlení vhodného formátu a následně vytvoření uživatelsky příjemného editoru:

Bezejmenný

Bezejmenný

Recyklace kódu obecně je velmi žádoucí, uživatel – vývojář by měl mít možnost co nejjednodušeji řešit i komplexní problémy, jako například různá menu. Následují tři obrázky různých nabídek, ač by se mohlo zdát, že každá funguje úplně jinak, opak je pravdou.

Bezejmenný

Bezejmenný

Bezejmenný

Menu můžeme elegantně zapsat do metody, která převezme jako parametr strukturu, obsahující např. pole texty_položek, položka_aktivována, barvy_položek. Následně vrátíme index vybrané položky a vývojář se v nějaké konstrukci switch postará o zpracování výsledků. Tvořme tedy prototypy, specifikaci chování nechme na koncovém uživateli.

Teď se přesunu k další části toho, co musí každý herní engine umět – rendrovat herní scénu.

Bezejmenný

Abychom mohli rendrovat potřebujeme kameru – objekt, který vymezí rendrovanou plochu a provede normalizaci souřadnic vykreslovaných objektů. Asi nejednoduší – pevná kamera se prostě zamkne na určité instanci a následuje ji. Je vhodné vyřešit floating kamery, když změníme její target tak, aby připlula k cíli. V konzoli to umožní tvorbu působivých cutscén.

Jak správně rendrovat? Při práci s konzolí není prakticky problém procházet i rozsáhlé kolekce, program prostě využije více paměti RAM. Problém je vykreslovat – pokud by render prošel každou souřadnici z vykreslované plochy a ihned ji vykreslil, hra by se kvůli sekání nedala hrát – věřte mi, takhle to nejdříve vypadalo. Mnohem lepší návrhové řešení je klasicky všechno projít, uložit do stringu a ten nakonec vykreslit. Takto jednovrstvé vykreslování je ale nedostatečné. Kupříkladu chceme, aby předmět pohozený na zemi napsal svoje jméno / vlastnosti, jakmile se k němu hráč dostatečně přiblíží:

Bezejmenný

Proto je potřeba zavést druhou vrstvu vykreslování a rozčlenit krok (fps) hry. Tento krok probíhá 60x/s:

Bezejmenný

Krok (step událost) tedy rozdělíme na aktivní/neaktivní podle toho, zda hráč zadal nějaký vstup (např. stisk pohybové klávesy). V metodě fps, třídy render necháme všechny aktivní (na scéně) objekty provést svůj postRender kód. Vývojáři ocení, když pro ně připravíme co nejvíce metod, kor když jsou mírně netradiční a inovativní. Rendrování kružnic, elips, rámečků, 3D těles v konzoli? Proč ne?

Bezejmenný

V konzolových hrách se také často využívají různé druhy osvětlení, takže jsem implementoval shadowcasting a raycasting:

165981_1102793176434021_7068835643034530173_n

Hru tvoří také ozvučení, takže je důležité implementovat třídu pro zvuky. Mohu pouze doporučit knihovnu NETVorbis, kterou v enginu používám. Zvuky je nutno přehrávat na samostatném vlákně / továrně. V enginu přehrání zvuku vypadá takto:

int soundID = Sound.getInstance.playSound(„sfx.ogg“); //mp3, wav, ogg

Pokud chci zvuk zastavit, zavolám:

Sound.getInstace.stopSound(soundID);

Výhodou je, že můžu simultánně přehrávat více stejných zvuků a zastavit ten, který chci, nikoliv všechny jako v GMS.