Compare commits
No commits in common. "ch2" and "master" have entirely different histories.
10
ch1.tex
10
ch1.tex
@ -45,7 +45,7 @@ Při jejich návrhu je~třeba zvážit: jak~mechaniky podporují zvolený žánr
|
|||||||
|
|
||||||
Při~výběru platformy je~nutné zvážit technická omezení a~očekávání hráčů na~dané platformě. Například mobilní hry často využívají dotykové ovládání a~krátké herní smyčky, zatímco hry pro~PC a~konzole mohou nabídnout komplexnější mechaniky a~delší herní dobu.
|
Při~výběru platformy je~nutné zvážit technická omezení a~očekávání hráčů na~dané platformě. Například mobilní hry často využívají dotykové ovládání a~krátké herní smyčky, zatímco hry pro~PC a~konzole mohou nabídnout komplexnější mechaniky a~delší herní dobu.
|
||||||
|
|
||||||
\paragraph{Kopírování} Kopírování cizích a~vlastních nápadů je~nedílnou součástí úspěšného vývoje. Vyplatí~se mít přehled ve~vybraném žánru a~mechanikách. Není nic špatného učit~se na~chybách a~úspěších jiných her. Důležité ale~je si~pamatovat, že~neexistuje deterministický vzorec, jak~vytvořit dokonalou kombinaci příběhů, žánrů a~mechanik tak, aby~hra získala oblibu hráčů.
|
\paragraph{Kopírování} Kopírování cizích a~vlastních nápadů je~nedílnou součástí úspěšného vývoje. Hodně se~vyplatí mít přehled ve~vybraném žánru a~mechanikách. Není nic špatného učit~se na~chybách a~úspěších jiných her. Důležité ale~je si~pamatovat, že~neexistuje deterministický vzorec, jak~vytvořit dokonalou kombinaci příběhů, žánrů a~mechanik tak, aby~hra získala oblibu hráčů.
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\paragraph{Minihry} Skvělou metodou, jak~rozptýlit hráče od~monotonie herního cyklu jsou~minihry. Přitom je~lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k~relaxaci mezi náročnějšími segmenty hry. Důležité~je, aby~jejich design byl v~souladu s~celkovým stylem hry a~nepůsobil rušivě. Například rytmická minihra ve~fantasy RPG může být zajímavým doplňkem, ale~v~realistické hororové hře by~působila nepatřičně.
|
\paragraph{Minihry} Skvělou metodou, jak~rozptýlit hráče od~monotonie herního cyklu jsou~minihry. Přitom je~lze aplikovat kdykoliv. Minihry většinou buď poskytují odměnu, anebo slouží k~relaxaci mezi náročnějšími segmenty hry. Důležité~je, aby~jejich design byl v~souladu s~celkovým stylem hry a~nepůsobil rušivě. Například rytmická minihra ve~fantasy RPG může být zajímavým doplňkem, ale~v~realistické hororové hře by~působila nepatřičně.
|
||||||
@ -81,7 +81,7 @@ Pokud ignorujeme chybějící dokumentaci, je~Unreal Engine stejný engine jako~
|
|||||||
|
|
||||||
Aktuálně UE~se~orientuje na~3D~hry převážně s~grafikou vysoké kvality a~stejně jako Unity podporuje většinu aktuálních platforem. Taky se~skvěle hodí pro~tvorbu filmu, motion design a~realtime simulace. Navíc díky technologiím jako~Nanite a~Lumen začína přebírat trh architektonických rendereru.
|
Aktuálně UE~se~orientuje na~3D~hry převážně s~grafikou vysoké kvality a~stejně jako Unity podporuje většinu aktuálních platforem. Taky se~skvěle hodí pro~tvorbu filmu, motion design a~realtime simulace. Navíc díky technologiím jako~Nanite a~Lumen začína přebírat trh architektonických rendereru.
|
||||||
|
|
||||||
\paragraph{CryEngine\protect\footnote{https://www.cryengine.com/}} CryEngine je velmi podobný Unreal Enginu za~výjimkou toho, že~se~specialuzuje jen na~vývoj her. Taky~již~není tolik univerzalní, dokumentace je~ještě míň, komunita je~velmi malá a~přívětivost je snad nejhorší možná. Je~to~dost úzce specializovaný engine, který potřebuje silné odborníky k~jeho ovládání.
|
\paragraph{CryEngine\protect\footnote{https://www.cryengine.com/}} CryEngine je hodně podobný Unreal Enginu za~výjimkou toho, že~se~specialuzuje jen na~vývoj her. Taky~již~není tolik univerzalní, dokumentace je~ještě míň, komunita je~velmi malá a~přívětivost je snad nejhorší možná. Je~to~dost úzce specializovaný engine, který potřebuje silné odborníky k~jeho ovládání.
|
||||||
|
|
||||||
Všechny známé hry na~CE~jsou zaměřené na~velmi propracovanou grafiku a~částo hry s~mechanikami boje nebo~střelby od~první osoby. Nedokázal jsem dohledat žádné 2D~hry nebo~indie, což~je~pochopitelné. 2D~hry není specializace CryEngine a~tvořit indie na~tomto enginu je~neefektivní až~nepřínosné. Taky~často vývojáři her na~CE se~přiznávají, že~je~nutné přizpůsobovat zdrojový kód enginu podle vlastních potřeb, což~ještě~víc odrazuje začátečníky.
|
Všechny známé hry na~CE~jsou zaměřené na~velmi propracovanou grafiku a~částo hry s~mechanikami boje nebo~střelby od~první osoby. Nedokázal jsem dohledat žádné 2D~hry nebo~indie, což~je~pochopitelné. 2D~hry není specializace CryEngine a~tvořit indie na~tomto enginu je~neefektivní až~nepřínosné. Taky~často vývojáři her na~CE se~přiznávají, že~je~nutné přizpůsobovat zdrojový kód enginu podle vlastních potřeb, což~ještě~víc odrazuje začátečníky.
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ Samozřejmě to~přináší nějaký overhead, hlavně když se~jedná o~práci
|
|||||||
|
|
||||||
Největší nevýhodou je~překvapivě nepřehlednost kódu, která~nejčastěji značí špatný programátorský návrh nebo lenost autora. Totiž velký počet vizuálních bloků a~jejich propojení není možné umístit přehledně na~jednu obrazovku. To~potom vyúsťuje v~nepřehledný mix různých logických částí, které~jsou dost obtížné na~orientaci a~údržbu. Napravit~to nejde ani~rozdělením jedné funkce do~více funkcí v~samotném Blueprintu. Nepřehledný mix propojení bloků se~pouze změní na~nepřehledný mix oken s~ruzným kódem. Správný postup v~tomto případě je~ručně konvertovat logiku z~Blueprintu do~C++.
|
Největší nevýhodou je~překvapivě nepřehlednost kódu, která~nejčastěji značí špatný programátorský návrh nebo lenost autora. Totiž velký počet vizuálních bloků a~jejich propojení není možné umístit přehledně na~jednu obrazovku. To~potom vyúsťuje v~nepřehledný mix různých logických částí, které~jsou dost obtížné na~orientaci a~údržbu. Napravit~to nejde ani~rozdělením jedné funkce do~více funkcí v~samotném Blueprintu. Nepřehledný mix propojení bloků se~pouze změní na~nepřehledný mix oken s~ruzným kódem. Správný postup v~tomto případě je~ručně konvertovat logiku z~Blueprintu do~C++.
|
||||||
|
|
||||||
\paragraph{C++} Práce s~C++ v~Unreal Engine je~zkutečně podobná práci s~velkými frameworky, například Qt. Použití čistého C++ je~zcela povolené, ale~takový kód potom nelze použít v~blueprintech a~tedy i~editoru. Unreal Engine proto definuje speciální makra jako~třeba UCLASS a~UFUNCTION pro~možnost integrování kódu buď~přímo do~blueprintu nebo~aspoň systému reflexe. Makra se~potom zpracovávají ne~macro preprocessor, ale~Unreal Header Tool nebo~Unreal Build Tool, které~slouží jako~generatory kódu. Generatory potom sami generují potřebné funkce a~proměnné pro~systém reflexe a~editor.
|
\paragraph{C++} Práce s~C++ v~Unreal Engine je~hodně podobná práci s~velkými frameworky, například Qt. Použití čistého C++ je~zcela povolené, ale~takový kód potom nelze použít v~blueprintech a~tedy i~editoru. Unreal Engine proto definuje speciální makra jako~třeba UCLASS a~UFUNCTION pro~možnost integrování kódu buď~přímo do~blueprintu nebo~aspoň systému reflexe. Makra se~potom zpracovávají ne~macro preprocessor, ale~Unreal Header Tool nebo~Unreal Build Tool, které~slouží jako~generatory kódu. Generatory potom sami generují potřebné funkce a~proměnné pro~systém reflexe a~editor.
|
||||||
|
|
||||||
V~C++ a~navíc s~otevřeným kódem celého enginu, má~vývojář plnou kontrolu nad~během programu nebo~jeho debugováním. Problém je~ale~použití assetů z~editoru nebo~reference objektů v~herním světě. Jsou~možnosti jak~to~obejít, například statické načtení assetu z~registru pomoci konstantní plné cesty k~assetu nebo~přeiterovat všechny objekty ve~světě. Editor samořejmě není schopen takové reference udržovat v~případě přemístění assetu a~časté iterování přes všechny objekty je~citelná zátěž. Proto ve~většíně případů je~potřeba zpřístupnít celou třídu do~Blueprintu a~v~editoru rovněž vytvořit Blueprint podtřídu, která~bude pouze přiřazovat potřebné reference.
|
V~C++ a~navíc s~otevřeným kódem celého enginu, má~vývojář plnou kontrolu nad~během programu nebo~jeho debugováním. Problém je~ale~použití assetů z~editoru nebo~reference objektů v~herním světě. Jsou~možnosti jak~to~obejít, například statické načtení assetu z~registru pomoci konstantní plné cesty k~assetu nebo~přeiterovat všechny objekty ve~světě. Editor samořejmě není schopen takové reference udržovat v~případě přemístění assetu a~časté iterování přes všechny objekty je~citelná zátěž. Proto ve~většíně případů je~potřeba zpřístupnít celou třídu do~Blueprintu a~v~editoru rovněž vytvořit Blueprint podtřídu, která~bude pouze přiřazovat potřebné reference.
|
||||||
|
|
||||||
@ -154,10 +154,10 @@ Zároveň takova metoda není schopná poskytnout některé grafické techniky.
|
|||||||
Postprocessing je~technika dodatečného zpracování vyrenderovaného obrazu. Většinou se~jedná o~triviální manipulaci barev, ale~lze~tady dělat i~spoustu dizajnových a~technickych triků. Např.~různé glitch efekty, efekty tepelného/nočního vidění~atd. získané pomocí procedurální nebo~statické modulace obrazu. V~deffered rendereru navíc lze~používat screen space techniky, které~používají vyrenderovaný snímek k~rychlé tvorbě odrazů (SSR - Screen Space Reflections) nebo~zastínění (SSAO - Screen Space Ambient Occlusion).
|
Postprocessing je~technika dodatečného zpracování vyrenderovaného obrazu. Většinou se~jedná o~triviální manipulaci barev, ale~lze~tady dělat i~spoustu dizajnových a~technickych triků. Např.~různé glitch efekty, efekty tepelného/nočního vidění~atd. získané pomocí procedurální nebo~statické modulace obrazu. V~deffered rendereru navíc lze~používat screen space techniky, které~používají vyrenderovaný snímek k~rychlé tvorbě odrazů (SSR - Screen Space Reflections) nebo~zastínění (SSAO - Screen Space Ambient Occlusion).
|
||||||
|
|
||||||
\subsection*{- 2D}
|
\subsection*{- 2D}
|
||||||
Je~více způsobů práce s~2D~grafikou, avšak udělat čistě 2D~hru bude problematické. V~oficiální nabídce je~rozhraní Paper~2D\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/paper-2d-overview-in-unreal-engine}, které~vývoj 2D~hry sice zjednodušuje, ale~přesto má pouze základní prvky 2D~enginu. Místy chybí optimalizace, protože soubory v~editoru jsou neracionálně velké a~ve~větších projektech engine začíná být náročný na~hardware. Proto se~pro~2D~hry Unreal~Engine moc nehodí a~je~doporučené rozhlédnout~se po~konkurenčních enginech.
|
Je~více způsobů práce s~2D~grafikou, avšak udělat čistě 2D~hru bude problematické. V~oficiální nabídce je~rozhraní Paper~2D\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/paper-2d-overview-in-unreal-engine}, které~vývoj 2D~hry sice zjednodušuje, ale~přesto má pouze základní prvky 2D~enginu. Místy chybí optimalizace, protože soubory v~editoru jsou neracionálně velké a~ve~větších projektech engine začíná být hodně náročný na~hardware. Proto se~pro~2D~hry Unreal~Engine moc nehodí a~je~doporučené rozhlédnout~se po~konkurenčních enginech.
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\paragraph{UI} UI~lze programovat v~C++ pomoci třídy Slate nebo~přímo pomoci Blueprintů v~editoru. V~Slate prostředí se~programuje nízkoúrovňové tedy je stejné jako programování okenní windows aplikace pomocí Win32~API bez~přímé vizualizace. Mnohem pohodlnější je práce v~editoru, kde~rovnou lze vidět výsledek. Celkově tvorba UI v~Unreal Engine je~jedna z~jeho nejsilnějších stránek mezi konkurenty, i~když se~o~ní~moc nemluví.
|
\paragraph{UI} UI~lze programovat v~C++ pomoci třídy Slate nebo~přímo pomoci Blueprintů v~editoru. Programování se~Slate je~hodně nízkoúrovňové tedy stejné jako~slepé programování okenní windows aplikace pomocí Win32~API.Mnohem pohodlnější je práce v~editoru, kde~rovnou lze vidět výsledek. Celkově tvorba UI v~Unreal Engine je~jedna z~jeho nejsilnějších stránek mezi konkurenty, i~když se~o~ní~moc nemluví.
|
||||||
|
|
||||||
Pro~zobrazení UI~nebo jiných 2D~prvků ve~3D bylo vždy možné vytvořit klasickou plochu s~texturou/materiálem nebo~renderovat text do~3D~světa. Samotné renderování textu ve~3D je~implementováno pomoci generace 3D~objektu z~vektorového fontu, což~je často výkonnostně přehnané řešení neboť mesh texty jsou již součástí hotového modelu. Ještě lze použít renderování textu z~předgenerované průhledné rastrové textury fontu. Poslední způsob je~dost rychlý na~implementaci a~výkonnostně nejlepší pokud výstup nemusí být nějak extra kvalitní. Nejlepší možností je~generovat text vektorově v~UI a~následně ho promítnout do~3D~světa, což~je umožněno pomoci již~zmíněných UI~tříd.
|
Pro~zobrazení UI~nebo jiných 2D~prvků ve~3D bylo vždy možné vytvořit klasickou plochu s~texturou/materiálem nebo~renderovat text do~3D~světa. Samotné renderování textu ve~3D je~implementováno pomoci generace 3D~objektu z~vektorového fontu, což~je často výkonnostně přehnané řešení neboť mesh texty jsou již součástí hotového modelu. Ještě lze použít renderování textu z~předgenerované průhledné rastrové textury fontu. Poslední způsob je~dost rychlý na~implementaci a~výkonnostně nejlepší pokud výstup nemusí být nějak extra kvalitní. Nejlepší možností je~generovat text vektorově v~UI a~následně ho promítnout do~3D~světa, což~je umožněno pomoci již~zmíněných UI~tříd.
|
||||||
|
|
||||||
|
185
ch2.tex
185
ch2.tex
@ -1,128 +1,103 @@
|
|||||||
\chapter{Vývoj hry}
|
\chapter{More complicated chapter}
|
||||||
\label{chap:main}
|
\label{chap:math}
|
||||||
|
|
||||||
Přenos starého projektu na~další major verzi~UE nebyl nijak problematický, dokonce v~editoru je~možnost rychlého exportu assetů do~jiného projektu. Rozhodně tomu pomohlo, že~se~C++~kód nepřenášel, ale~napsal znovu. UE~citelně rozšířil seznam dostupných tříd, ale~zaroveň některé jsou~již deprecated nebo~odstraněny úplně. Tak~například byly~odstraněny třídy Matinee (bývalý format animací pohybu objektů) pro~podporu novejší třídy Sequencer nebo~starý PhysX rozhraní (Fyzický engine), které~je nahrazeno systémem Chaos. Přesto se~něco pokazilo při~exportu objektů s~dynamickou fyzikou (závěsy, které~reagují na~simulaci větru, se~museli předělat).
|
After the reader gained sufficient knowledge to understand your problem in \cref{chap:refs}, you can jump to your own advanced material and conclusions.
|
||||||
|
|
||||||
Přenos byl~odůvodněn převážně malou velikostí starého projektu a~taky lákavou nabídkou nových technologií zejména Nanite a~Lumen. Navíc pátá verze Unrealu -- přesněji verze~5.5 -- přinesla značná vylepšení jako:
|
You will need definitions (see \cref{defn:x} below in \cref{sec:demo}), theorems (\cref{thm:y}), general mathematics, algorithms (\cref{alg:w}), and tables (\cref{tab:z})\todo{See documentation of package \texttt{booktabs} for hints on typesetting tables. As a main rule, \emph{never} draw a vertical line.}. \Cref{fig:f,fig:g} show how to make a nice figure. See \cref{fig:schema} for an example of TikZ-based diagram. Cross-referencing helps to keep the necessary parts of the narrative close --- use references to the previous chapter with theory wherever it seems that the reader could have forgotten the required context. Conversely, it is useful to add a few references to theoretical chapters that point to the sections which use the developed theory, giving the reader easy access to motivating application examples.
|
||||||
\begin{itemize}
|
|
||||||
\item Nový systém zpracování vstupu Enhanced Input\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine}. Místy má~příliš mnoho objektové abstrakce, ale~rozhodně velký krok vpřed. Umožňuje snadné dynamické přepínání různých sad ovládání (multiplayer hry, gameplay/menu), dynamické modifikátory a~spouštěče vstupu (změna senzitivity, víceklik, podržení tlačítka určitou dobu), podpora vstupu více než~jedné periferie naraz a~podpora přeřazení vstupu (např.~změna tlačítka odpovídající za~skok herní postavy). Předtím tohle a~spoustu dalšího se~muselo naprogramovat ručně.
|
|
||||||
\item Podporu vektorové grafiky v~UI. Veškeré staré UI~elementy byly~tvořeny pomocí základních vektorových obdélníkových tvarů práve proto, aby~se~vyhnulo použití rastrové grafiky, která~je~velmi závislá na~rozlišení. Aktuálně všechny UI~elementy jsou tvořeny ještě starou metodou, pro~udržení konzistentního vzhledu. Dnes bychom určitě využili této~možnosti.
|
|
||||||
\item Přepracované vykreslování textů -- rychlejší vykreslování a~efektivnější využití paměti.
|
|
||||||
\item MetaSound\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/metasounds-the-next-generation-sound-sources-in-unreal-engine} pro~přehrávaní nebo procedurální generování zvuků, který~nahrazuje starou třídu~Cue. De-facto se~jedná o~Digital Signal Processing (DSP) grafový engine a~editor. Bohůžel jsem nestihl tento nastroj využit v~práci.
|
|
||||||
\item World partition systém\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/world-partition-in-unreal-engine} který~dokáže automaticky rozdělit jeden velký svět na~streamovací kousky a~propojit sdílení dat mezi nimi i~při multiplayer hře přes internet. Taky není využit v~této práci.
|
|
||||||
\end{itemize}
|
|
||||||
Samozřejmě je~toho daleko víc, ale~většina ostatních vylepšení jako~například nový systémy animací postav Motion Matching\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine} nebo~nový fyzikální engine Chaos\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/destruction-overview} neměli vliv na~rozhodnutí.
|
|
||||||
|
|
||||||
Podrobné informace jak každá implementace funguje a jak vývojaři s ní pracovat jsou popsané v programatorské dokumentaci.
|
\section{Example with some mathematics}
|
||||||
|
\label{sec:demo}
|
||||||
|
|
||||||
\section{Herní logika, systémy, mechaniky}
|
\begin{defn}[Triplet]\label{defn:x}
|
||||||
\label{sec:systemsAndMechanics}
|
Given stuff $X$, $Y$ and $Z$, we will write a \emph{triplet} of the stuff as $(X,Y,Z)$.
|
||||||
\subsection{Architektura}
|
\end{defn}
|
||||||
Protože Unreal Engine byl na začátku vývíjen primárně pro online multiplayer hru Unreal Tournament a dnes stejně tak vyvíjen spolu s extremně velkou online multiplayer hrou Fortnite, je backend enginu dost abstraktní.
|
|
||||||
|
|
||||||
Například tak každý svět musí obsahovat vlastní game mode (třída AGameMode), který funguje jako správce dáneho světu -- přestože svět se může spravovát sám. Veškerá funkcionalita používaná v singlplayer hrách mohla by být přímo v kódu levelu nebo v globální instanci celé hry. Důvodem teto abstrakce je právě nativní podpora multiplayer her, která potom vývoj takových her zjednodušuje.
|
\newcommand{\Col}{\textsc{Colour}}
|
||||||
|
|
||||||
Protože tento projekt je zaměřen pro hru jednoho hráče, práce je často programováná navzdory ustaleným UE C++ guidelines pro pohodlí a rychlost vývoje. Proto často třídy managerů systémů, game modů, instance hráče a další jsou na architektuře singletonu. Šetří od tří do desetí různých volání getteru, castu reflexe, vyhledávání v hash tabulkach a iteraci polí v každém místě použití. Přesto nemá žádný vliv na stabilitu programu a dokonce šetří výkonem zařízení.
|
\begin{thm}[Car coloring]\label{thm:y}
|
||||||
|
All cars have the same color. More specifically, for any set of cars $C$, we have
|
||||||
|
$$(\forall c_1, c_2 \in C)\:\Col(c_1) = \Col(c_2).$$
|
||||||
|
\end{thm}
|
||||||
|
|
||||||
Jen pro představu co obnaší klasické ziskání reference na instanci vlastní třídy hráče na pozadí. GetGameMode()\textrightarrow GetPlayerController(index)\textrightarrow GetPlayerPawn()\textrightarrow Cast<Class>(). A blueprinty disponují zkrácenou verzí GetPlayerPawn(index)\textrightarrow Cast<Class>(). V případě C++ je potřeba navíc ověřovat zda nějaké z volání nevratílo nullptr.
|
\begin{proof}
|
||||||
|
Use induction on sets of cars $C$. The statement holds trivially for $|C|\leq1$. For larger $C$, select 2 overlapping subsets of $C$ smaller than $|C|$ (thus same-colored). Overlapping cars need to have the same color as the cars outside the overlap, thus also the whole $C$ is same-colored.\todo{This is plain wrong though.}
|
||||||
|
\end{proof}
|
||||||
|
|
||||||
\subsection{Scény a ukládání hry}
|
\begin{table}
|
||||||
Scény resp. levely (třídy UWorld a ALevelScriptActor)\footnote{UWorld instance je přímo celý svět, který funguje jako balík metadat a kontejner pro veškeré instancované objekty v něm. ALevelScriptActor je objekt instancovaný v UWorld automaticky a obsahuje uživatelskou logiku světa.} taktéž lze získat v podobě singletonu. Základní implementace byla rozšířená pro high level mechanismus volání událostí ve scéně. Ten je za potřebí například, když hráč aktivuje spínací plošinu ve hře a ta následně otevře dveře. Narozdíl od jiných enginů, v UE objekty ve světě nemůžou referencovat jiné nezávislé objekty. Jednoduše referenci nejde přiřadít z důvodu abstrakce popsané v předchozí podsekci, protože každý objekt může mít vlastní herní svět (a nejen to). Proto pokud plošina z našeho príkladu chce otevřít dveře, musí zkusit poslat požádavek správcí herního světa, ten požadavek se nějak zpracuje a jen potom správce buď provede akci otevírání dveří samostatně nebo zavolá odpovidající funkci v instanci objektu. Pokud by byla potřeba zbavit se použití singleton architektury pro podporu paralelní existenci světů, stači předělat member funkci instance světa na statický multicast delegate\footnote{Delegate jsou obaly na C++ funkce, lambdy, funkce s reflexi a funkce z Blueprintu. Delegate může být typu single, pro uložení reference na jednou funkci, nebo multicast pro uložení dynamického seznamu funkcí. Podrobněji jsou popsané v programatorské dokumentaci.}, ke kterému se každý svět při konstrukci bude vázat.
|
% uncomment the following line if you use the fitted top captions for tables
|
||||||
|
% (see the \floatsetup[table] comments in `macros.tex`.
|
||||||
Navíc hra byla rozšířena o implementaci obnovení hry z úložených dat. Při návrhu byla snaha udělat postup nejvíc triviální. Hru ukládá globální herní instance (třída GameInstance)\footnote{GameInstance je první objekt vytvořený enginem hned po úvodním načtení základu enginu a taky poslední objekt na destrukci při vypínání hry.} při vypínání hry a načíta taktéž při spouštění. Využit byl existující v UE systém serializace, který ukládá inventař postavy, jmeno levlu a checkpoint na něm spolu s posledním stavem levlu.
|
%\floatbox{table}[\FBwidth]{
|
||||||
|
\centering\footnotesize\sf
|
||||||
\subsection{Interakce}
|
\begin{tabular}{llrl}
|
||||||
Interakce jsou často řešeny pomoci architektury interface tříd\footnote{Interface třídy jsou konkurenčním přístupem komponentní architektuře. Interface je běžná praktika v OOP, která funguje jako domluva, že objekt bude obsahovat určité member funkce. Komponentny jsou samostatné určité podinstance objektu. Komponentní přístup se osvědčuje jako intuitivnější a více flexibilní zatímco Interface přístup při vývoji her je spíše nepřijemné vynucení ze světu OOP.} především kvůli populárním návodům vyzdvihující tuto metodu jako nejlepší ještě z doby, kdy jen vzníkal Unreal Engine 4. Nevýhodou je potřeba v obsáhlem a repetetivním nastavení každeho objektu, který chceme zapojit do mechaniky interakce.
|
\toprule
|
||||||
|
Column A & Column 2 & Numbers & More \\
|
||||||
Byl navržen kompletní systém pro spravu každého interačního objektu a komponent (viz.\Cref{fig:InteractableSystemDiagram}). Objekt dědicí třídu AInteractable při instancování samostatně nastaví a následně přepína potřebné kolize. Navíc spravuje interakční komponenty a reaguje na požadavky k ním. Komponenty se dělí na aktivatory a modifikatory.
|
\midrule
|
||||||
|
Asd & QWERTY & 123123 & -- \\
|
||||||
|
Asd qsd 1sd & \textcolor{red}{BAD} & 234234234 & This line should be helpful. \\
|
||||||
|
Asd & \textcolor{blue}{INTERESTING} & 123123123 & -- \\
|
||||||
|
Asd qsd 1sd & \textcolor{violet!50}{PLAIN WEIRD} & 234234234 & -- \\
|
||||||
|
Asd & QWERTY & 123123 & -- \\
|
||||||
|
\addlinespace % a nice non-intrusive separator of data groups (or final table sums)
|
||||||
|
Asd qsd 1sd & \textcolor{green!80!black}{GOOD} & 234234299 & -- \\
|
||||||
|
Asd & NUMBER & \textbf{123123} & -- \\
|
||||||
|
Asd qsd 1sd & \textcolor{orange}{DANGEROUS} & 234234234 & (no data) \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
%}{ % uncomment if you use the \floatbox (as above), erase otherwise
|
||||||
|
\caption{An example table. Table caption should clearly explain how to interpret the data in the table. Use some visual guide, such as boldface or color coding, to highlight the most important results (e.g., comparison winners).}
|
||||||
|
%} % uncomment if you use the \floatbox
|
||||||
|
\label{tab:z}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=1\linewidth]{img/InteractableSystemDiagram.pdf}
|
\includegraphics[width=.6\linewidth]{img/ukazka-obr02.pdf}
|
||||||
\caption{Debug náhled aktivace interakčních objektů v zornem poli hráče.}
|
\caption{A figure with a plot, not entirely related to anything. If you copy the figures from anywhere, always refer to the original author, ideally by citation (if possible). In particular, this picture --- and many others, also a lot of surrounding code --- was taken from the example bachelor thesis of MFF, originally created by Martin Mareš and others.}
|
||||||
\label{fig:InteractableSystemDiagram}
|
\label{fig:g}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\newpage
|
|
||||||
\paragraph{AInteractableActivator} Aktivátory jsou komponenty s úrčitými mechanismy detekce objektů. Instance hráče automaticky vytváří pro sebe jednu podinstanci každého aktivatoru zaregistrovaného v enginu. Libovolný objekt taky může obsahovat libovolný aktivator. Práce obsahuje klasický způsob detekce objektů pomoci raytracingu a castu objektu v případě nárazu paprsku.
|
|
||||||
|
|
||||||
Navíc je k dispozici detekce objektů v zornem poli hráče. Ta funguje na zpomaleném snímání určité stencil vrstvy s vynecháním většiny render pipliny a v malém rozlišení. Zachycený snímek obsahuje pouze viditelné hráčem interakční objekty v podobě masky. Nasledně maska v grafickém vlakně je zpracovaná pomocí algoritmu vyhledávání komponent z počítačového vidění, kterou poskytuje kníhovna OpenCV. Nakonec do středu nalezených komponent se promítné paprsek a zachytí objekty (viz. \Cref{fig:InteractableScreenCapture}). Původně bylo předpokládáno využití HLSL compute shaderu pro vyhledání komponent v textuře, ale z časových důvodu jsem nedodělal přenos dat mezi CPU a GPU, jelikož dohledat dokumentaci o použití shaderu je dost náročné. Proto aktuální vyhledávání komponent je spouštěno na procesoru a v renderovacím vlakně na moderních zařízeních trvá pět až deset milisekund. V praxi se takový úkol řeší náhodným promítáním velkého množství paprsků nebo velkým hitboxem napodobující tvar frustrumu kamery. Taková řešení jsou sice rychlá na implementaci, ale začínají být nekvalitní až nepoužítelné pro trochu větší vzdalenosti než ,,pár metrů''. Navíc zahrnují časté počítání nárazů na velké množství objektů, čímž výkonostně nejsou o nic lepší naimplementováné metody v této práci.
|
|
||||||
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=1\linewidth]{img/InteractableScreenCapture.pdf}
|
\tikzstyle{box}=[rectangle,draw,rounded corners=0.5ex,fill=green!10]
|
||||||
\caption{Debug náhled aktivace interakčních objektů v zornem poli hráče.}
|
\begin{tikzpicture}[thick,font=\sf\scriptsize]
|
||||||
\label{fig:InteractableScreenCapture}
|
\node[box,rotate=45] (a) {A test.};
|
||||||
|
\node[] (b) at (4,0) {Node with no border!};
|
||||||
|
\node[circle,draw,dashed,fill=yellow!20, text width=6em, align=center] (c) at (0,4) {Ugly yellow node.\\Is this the Sun?};
|
||||||
|
\node[box, right=1cm of c] (d) {Math: $X=\sqrt{\frac{y}{z}}$};
|
||||||
|
\draw[->](a) to (b);
|
||||||
|
\draw[->](a) to[bend left=30] node[midway,sloped,anchor=north] {flow flows} (c);
|
||||||
|
\draw[->>>,dotted](b) to[bend right=30] (d);
|
||||||
|
\draw[ultra thick](c) to (d);
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\caption{An example diagram typeset with TikZ. It is a good idea to write diagram captions in a way that guides the reader through the diagram. Explicitly name the object where the diagram viewing should ``start''. Preferably, briefly summarize the connection to the parts of the text and other diagrams or figures. (In this case, would the tenative yellow Sun be described closer in some section of the thesis? Or, would there be a figure to detail the dotted pattern of the line?)}
|
||||||
|
\label{fig:schema}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\paragraph{AInteractableModificator} Modifikátory jsou komponenty s úrčitou logikou libovolné modifikace objektu, ve kterém jsou instancovány. Tyto komponenty mohou obsahovat pouze objekty označené jako interakční (dědí třídu interákčního objektu). Aktuální implementace nabízí modifikátory pro aktivaci nějaké události pomoci dosahu ,,ruky'' nebo zahlednutím ,,očí'' hráče, pohyb a rotace předmětu v prostoru, ukládání předmětu do inventáře hráče. Z časových důvodu byla zamítnuta implementace modifikace meshe objektu, která by využivala nového rozhraní Chaos.
|
\begin{algorithm}
|
||||||
|
\begin{algorithmic}
|
||||||
|
\Function{ExecuteWithHighProbability}{$A$}
|
||||||
|
\State $r \gets$ a random number between $0$ and $1$
|
||||||
|
\State $\varepsilon \gets 0.0000000000000000000000000000000000000042$
|
||||||
|
\If{$r\geq\varepsilon$}
|
||||||
|
\State execute $A$ \Comment{We discard the return value}
|
||||||
|
\Else
|
||||||
|
\State print: \texttt{Not today, sorry.}
|
||||||
|
\EndIf
|
||||||
|
\EndFunction
|
||||||
|
\end{algorithmic}
|
||||||
|
\caption{Algorithm that executes an action with high probability. Do not care about formal semantics in the pseudocode --- semicolons, types, correct function call parameters and similar nonsense from `realistic' languages can be safely omitted. Instead make sure that the intuition behind (and perhaps some hints about its correctness or various corner cases) can be seen as easily as possible.}
|
||||||
|
\label{alg:w}
|
||||||
|
\end{algorithm}
|
||||||
|
|
||||||
Právě u modifikátorů nejvíc přispěl nový system zpracování vstupu pro Unreal Engine 5. Modifikatory využívájí možnosti přidávání resp. odstranění kontextů vstupu za běhu.
|
\section{Extra typesetting hints}
|
||||||
|
|
||||||
\subsection{Cutscény a Quick Time Eventy}
|
Do not overuse text formatting for highlighting various important parts of your sentences. If an idea cannot be communicated without formatting, the sentence probably needs rewriting anyway. Imagine the thesis being read aloud as a podcast --- the storytellers are generally unable to speak in boldface font.
|
||||||
Unreal je slavný, jak dobře lze v něm animovat scénu. Rozhraní a editor systému Sequencer je pohodlné a bohaté na funkcionality. Bohůžel veškeré skvěle věci končí mimo editor, jelikož chybí pohodlná funkcionalita režije různých souborů animací (stejná poznámka se vztahuje i k UI animacím). Proto byl dodán systém UCutsceneManager implementující frontu animací spolu s uživatelským rozhraním přeskočení animace.
|
|
||||||
|
|
||||||
Pro přiblížení problému, vyjmenuji časté potřeby, které vzníkají při běžném použití animací.
|
Most importantly, do \underline{not} overuse bold text, which is designed to literally \textbf{shine from the page} to be the first thing that catches the eye of the reader. More precisely, use bold text only for `navigation' elements that need to be seen and located first, such as headings, list item leads, and figure numbers.
|
||||||
\begin{itemize}
|
|
||||||
\item Zároveň spuštěné animace bojují o vlastnictví objektů,
|
|
||||||
\item animace nelze přetáčet,
|
|
||||||
\item u animace nelze zjistit zpětně jestli byla přehrana do konce, pouze přivázat volaní funkce po ukončení,
|
|
||||||
\item animace umí říct jestli je někdé přehráváná, ale neřekné kde.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
Převážně pro použití v animacích je naimplementováná fronta nečekaných událostí, což jsou interaktivní UI elementy na obrazovce hráče. V herním průmyslu jsou využívány zejména v cutscénach, pro ,,hlubší ponoření'' hráče do děje. Klasickými příklady jsou animace šplhání herní postavy po nějaké překážce nebo kinematografický souboj mezi postavy. Při takových údalostech lze přibližit hráče dynamické a napínavé situaci pomoci klikání na stejně dynamické UI elementy na obrazovce v souladu s pohybem herní postavy. V V praxi se objevují i pokročílejši varianty napodobení děje pohybem myší a joystickem nebo gyroscopem ovládače.
|
Use underline only in dire necessity, such as in the previous paragraph where it was inevitable to ensure that the reader remembers to never typeset boldface text manually again.
|
||||||
|
|
||||||
\subsection{Dialogy}
|
Use \emph{emphasis} to highlight the first occurrences of important terms that the reader should notice. The feeling the emphasis produces is, roughly, ``Oh my --- what a nicely slanted word! Surely I expect it be important for the rest of the thesis!''
|
||||||
V enginu je zavádějící implementace pokročílého dialogového systému. Má stejný problém jako animace. Dialogy jsou neintuitivní pro tvorbu a použití, vyžadují časté repetetivní kopírování stejných parametrů do souborů s linky dialogů a dohromady celý tento systém má málo dokumentace. Navíc ,,dialogy'' v tomto systému jsou pouze samostatné věty, které musí přehravat nějaký zvuk a mohou se vybírát v zavislostí na omezeném kontextu typu "kdo na koho mluví". O nepoužitelností takového rozhrání napovídají návody na tvorbu vlastních systému nebo vývojařský obchod plný pluginů implementujících tento systém lépe.
|
|
||||||
|
|
||||||
Protože kvalitná řešení jsou placená a ty zdarma jsou často nevyhovující kvality, byla navržená vlastní implementace. Jedna se o frontu, která umí přehravat celé tabůlky dialogových vět. Celý dialog nebo množinu vět společného kontextu lze pohodlně zapsat do tabulkového formátu přímo v editoru. Jedná věta obsahuje id, text, dobu přehrání nebo zvukovou stopu. Ve výsledku lze do fronty zařadit několik tabůlek, které se mohou přehrávat sekvenčně od n-té věty do poslední, jednu náhodnou větu nebo přesně jednu větu podle id.
|
|
||||||
|
|
||||||
\subsection{Minihry}
|
|
||||||
Gameplay druhého levlu je celý složen z miniher. V moment vydání -- práce obsahuje pouze pět hlavních pro gamedesign miniher v podobě ,,proof of concept''. Z časových důvodů zbylé vedlejší minihry nebyly implementováné. Každá z hlavních miniher je parodie na již existujicí známe hry.
|
|
||||||
|
|
||||||
Minihry jsou samostatné objekty, které manager scény startuje nebo vypíná. Po nastartování minihra sama přepné kontext ovládání na sebe a řídí vlastní stav. Jestli minihra nebyla ukončená dočasně ale dohráná, potom vráti ovládání hráči a spolu s tím výsledek a skóre.
|
|
||||||
|
|
||||||
Dostupné zkušební implementace:
|
|
||||||
\begin{itemize}
|
|
||||||
\item Parodie flash hry Age of War. V pozadí uklízení knížek dějepisu jsou umístěny základny hráče a soupeře (umělé inteligence). Hráč ovládá minihru pomici UI, kde nakupuje jednotky typu: pěšák, střelec a tank. Peníze získáva za zničení nepřátelských jednotek. Vyhrává soupeř, který dokázal přejít přes jednotky nepřátele až k základně a zdemolovat ji. V aktuální implementaci chybí vylepšení éry jednotek, zvuky, grafické efekty, modely a animace jednotek. Přesto lze vyzkoušet nakup a jejich ,,souboj'' jednotek.
|
|
||||||
\item Parodie na mobilní hru Subway Surfers. Aktuálně má minihra nevhodné pozadí, neobsahuje audio a grafické prvky. Podle návrh hráč nahání veverku v lese, která mu ukradla část důležitého pro příběh předmětu. Pomoci pohybů nahoru, dolu, doleva a napravo hráč uhýba objevujicím se lesním překážkam. Překážková dráha má šířku třech běžicích pruhů a překážky mohou vyžadovat přeskočení, sklouznutí nebo úlpý uhyb do strany.
|
|
||||||
\item Podoba počítačové rytmické hry Osu!. Hráč má za úkol klikat na objevující se na obloze hvězdičky v souladu s rytmem hudby (v pořadí ve kterém se objevili). Aktuálně ,,hvězdičky'' jsou v podobě čtverečků, ale hudba je zcela hotova. Již teď lze vyzkoušet klikání pro prvních 10 sekund doprovodu.
|
|
||||||
\item Podoba mobilní hry Crossy Road. Hráč pomoci pohybu dopředu, dozadu, doleva a dolu potřebuje posouvat se vpřed po překážkové dráze. Dráha je složená z pěti průhu kolmých ke kameře, a každý průh je složen z dvanáctí políček, na které může stoupnout hráč. Náhodně na krajích pruhu se objevují divoká zvířata, laviny a silný vítr (v originální hře to jsou auta na silnici), které se posouvají k opačnemu kraji přes všechná políčka a mohou ukončit běh hráče. Podle návrhu se bude hra odehrávát v ledovém prostředí, kde hráč bude procházet sněžnou krajinou. Audiovizuální prvky opět nejsouk dispozici, ale již teď teď lze vyzkoušet posun dopředu a uhyb překážkam.
|
|
||||||
\item Jednoduchá minihra rybolovu (více podob napříč různymi hry). Hráč má na obrazovce svislý obdelníkový indikátor znázorňující vodní hlubinu. Podél indikátoru se náhodně pohybuje obrázek rybičky, kterou hráč musí udržovat v malé pohyblivé zóně. Zóna se pohybuje automaticky dolu nebo nahoru držením tlačítká myší (rychlost pohybu není lineární ale kvadratická). V implementaci chybi zvukové assety a vyvaženost složitosti, ale je k dispozici kompletní UI a mechanika lovu.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Nehratelné postavy}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Nastavení}
|
|
||||||
|
|
||||||
|
|
||||||
\section{Návrh tvorby generativního obsahu a jeho načítání za běhu}
|
|
||||||
\label{sec:contentGenerationAndIntegration}
|
|
||||||
Nabízí se online tabulká skóre na základní a vygenerováné minihry.
|
|
||||||
|
|
||||||
\section{Grafika}
|
|
||||||
\label{sec:graphics}
|
|
||||||
\subsection{Statické objekty}
|
|
||||||
\subsection{Dynamické a procedurální objekty}
|
|
||||||
\subsection{Osvětlení, efekty, Post-Processing}
|
|
||||||
\subsection{Materiály a shadery}
|
|
||||||
\subsection{UI}
|
|
||||||
\subsection{Načítací obrazovka}
|
|
||||||
\subsection{Textové překlady}
|
|
||||||
|
|
||||||
\section{Audio}
|
|
||||||
\label{sec:audio}
|
|
||||||
\subsection{Kategorie a parametry audio assetů}
|
|
||||||
\subsection{Dynamický hudební doprovod}
|
|
||||||
|
|
||||||
\section{Tipy při vývoji v UE}
|
|
||||||
\label{sec:UETips}
|
|
||||||
|
|
||||||
\paragraph{Skripty pro editor}
|
|
||||||
% Blueprunty a python
|
|
||||||
\paragraph{C++ typy a reflexe}
|
|
||||||
\paragraph{Kompilace a export projektu}
|
|
||||||
|
|
||||||
\section{Co se nestihlo nebo změnilo}
|
|
||||||
|
|
||||||
|
Finally, never draw a vertical line, not even in a table or around figures, ever. Vertical lines outside of the figures are ugly.
|
||||||
|
Binary file not shown.
Binary file not shown.
12
intro.tex
12
intro.tex
@ -9,11 +9,11 @@ Přestože celé řešení zdánlivě funguje, spoléhá~se na~ochotu samotných
|
|||||||
Tato práce se~zaměřuje na~tvorbu hry a~návrh systému který~umožní výše popsaný lidský faktor a~nedostatky eliminovat. Přináší tak příběh rozdělený na~pět žánrově odlišných úrovní a~zavádí high-level API pro~Unreal~Engine na~stahování a~načítání obsahu do~hry přímo za~běhu. Specifický příběh snižuje ludonarativní disonanci\footnote{Souvislost resp.~logické propojení herního světa, příběhu a~gameplaye.} při vzníku nového obsahu ve~hře a~přítomnost více žánrů umožňuje otestovat, jestli toto řešení v~každém z~nich dostatečně funguje. Zároveň tato práce přenechává samotné generování obsahu pomoci AI modelů a~testování výsledků až~jako další rozšíření. Čili primárně se~zaměřuje na~kostru samotné hry, aby~spotom byl prostor, kam nový obsah začlenit.
|
Tato práce se~zaměřuje na~tvorbu hry a~návrh systému který~umožní výše popsaný lidský faktor a~nedostatky eliminovat. Přináší tak příběh rozdělený na~pět žánrově odlišných úrovní a~zavádí high-level API pro~Unreal~Engine na~stahování a~načítání obsahu do~hry přímo za~běhu. Specifický příběh snižuje ludonarativní disonanci\footnote{Souvislost resp.~logické propojení herního světa, příběhu a~gameplaye.} při vzníku nového obsahu ve~hře a~přítomnost více žánrů umožňuje otestovat, jestli toto řešení v~každém z~nich dostatečně funguje. Zároveň tato práce přenechává samotné generování obsahu pomoci AI modelů a~testování výsledků až~jako další rozšíření. Čili primárně se~zaměřuje na~kostru samotné hry, aby~spotom byl prostor, kam nový obsah začlenit.
|
||||||
|
|
||||||
\pagebreak
|
\pagebreak
|
||||||
Hlavní témata na~které se~práce zaměřuje:
|
Hlavními tématy, na~které se~práce zaměřuje, jsou:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Ukázkové příklady tvorby herních systémů a~mechanik pro~Unreal~Engine (\cref{sec:systemsAndMechanics}).
|
\item Práce s~Unreal~Engine, jeho reálná omezení, obcházení/vyrovnání se~s~těmito omezení a~tipy.
|
||||||
\item Návrh tvorby generativního obsahu a~jeho načítaní v~Unreal Engine (\cref{sec:contentGenerationAndIntegration}).
|
\item Postupy tvorby různých druhů grafiky pro~3D hry zejména v~UE.
|
||||||
\item Postupy tvorby různé grafiky v~UE (\cref{sec:graphics}).
|
\item Postupy tvorby zvuků a~hudby pro~hry.
|
||||||
\item Postupy tvorby zvuků a~hudby pro~hry (\cref{sec:audio}).
|
\item Ukázkové příklady tvorby herních systémů a~mechanik pro~Unreal~Engine.
|
||||||
\item Práce s~Unreal~Engine, jeho reálná omezení, obcházení/vyrovnání se~s~těmito omezení a~tipy (\cref{sec:UETips}).
|
\item Tvorba generativního obsahu a~jeho načítaní na~Unreal Engine.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
60
refs.bib
60
refs.bib
@ -35,3 +35,63 @@
|
|||||||
year = 2023,
|
year = 2023,
|
||||||
note = {[cit. 2025-04-01]. Dostupné z: \url{https://alfredbaudisch.com/blog/gamedev/godot-engine/godots-3d-confusing-workflow-inconsistencies-conflicting-behaviours-and-annoyances/}}
|
note = {[cit. 2025-04-01]. Dostupné z: \url{https://alfredbaudisch.com/blog/gamedev/godot-engine/godots-3d-confusing-workflow-inconsistencies-conflicting-behaviours-and-annoyances/}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@book{knuth1979tex,
|
||||||
|
title={TEX and METAFONT: New directions in typesetting},
|
||||||
|
author={Knuth, Donald Ervin},
|
||||||
|
year={1979},
|
||||||
|
publisher={American Mathematical Society}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{lamport1994latex,
|
||||||
|
title={LATEX: a document preparation system: user's guide and reference manual},
|
||||||
|
author={Lamport, Leslie},
|
||||||
|
year={1994},
|
||||||
|
publisher={Addison-Wesley}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{glasman2010science,
|
||||||
|
title={Science research writing for non-native speakers of English},
|
||||||
|
author={Glasman-Deal, Hilary},
|
||||||
|
year={2010},
|
||||||
|
publisher={World Scientific}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{sparling1989english,
|
||||||
|
title={English or Czenglish? Jak se vyhnout čechismům v angličtině},
|
||||||
|
author={Sparling, Don},
|
||||||
|
year={1989},
|
||||||
|
publisher={Státní pedagogické nakladatelství}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{tufte1990envisioning,
|
||||||
|
title={Envisioning information},
|
||||||
|
author={Tufte, Edward R and Goeler, Nora Hillman and Benson, Richard},
|
||||||
|
year={1990},
|
||||||
|
publisher={Graphics press Cheshire, CT}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{tufte1983visual,
|
||||||
|
title={Visual display of quantitative information},
|
||||||
|
author={Tufte, Edward R},
|
||||||
|
year={1983},
|
||||||
|
publisher={Graphics press Cheshire, CT}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{wilke2019fundamentals,
|
||||||
|
title={Fundamentals of Data Visualization},
|
||||||
|
author={Wilke, Claus O},
|
||||||
|
year={2019},
|
||||||
|
publisher={O'Reilly Media, Inc.},
|
||||||
|
url={https://clauswilke.com/dataviz/},
|
||||||
|
isbn={9781492031086}
|
||||||
|
}
|
||||||
|
|
||||||
|
@techreport{tantau2015tikz,
|
||||||
|
title={The TikZ and PGF Packages (Manual for version 3.1.8b)},
|
||||||
|
author={Tantau, Till},
|
||||||
|
year={2020},
|
||||||
|
institution={Institut f{\"u}r Theoretische Informatik Universit{\"a}t zu L{\"u}beck},
|
||||||
|
url={http://mirrors.ctan.org/graphics/pgf/base/doc/pgfmanual.pdf}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user