aboutsummaryrefslogtreecommitdiff
path: root/design.tex
diff options
context:
space:
mode:
Diffstat (limited to 'design.tex')
-rw-r--r--design.tex173
1 files changed, 105 insertions, 68 deletions
diff --git a/design.tex b/design.tex
index c7d0ca0..a7ad91e 100644
--- a/design.tex
+++ b/design.tex
@@ -15,7 +15,7 @@ similar to Jetpack Joyride.
The cr\^epe engine is designed to ease the transition for developers familiar with
Unity, ensuring minimal friction when switching platforms. Our aim is to preserve
-many of Unity’s core features while introducing a lightweight and open-source
+many of Unity's core features while introducing a lightweight and open-source
alternative, licensed under the MIT License.
The engine is primarily aimed at indie developers who have prior experience with
@@ -116,96 +116,126 @@ the main part of the \gls{ecs}. The design of these eight systems in combination
\section{Design}
\subsection{Texture}
-The textures in our game engine are represented by the \codeinline{Texture} class. It is implemented a \gls{facade} around the \gls{sdl} library.
+
+% FIXME: our
+The textures in our game engine are represented by the \codeinline{Texture} class. It
+is implemented a \gls{facade} around the \gls{sdl} library.
\subsubsection{Architecture}
-\Cref{fig:class-texture} shows a class diagram of the texture \gls{facade}. It contains the following classes:
+\Cref{fig:class-texture} shows a class diagram of the texture \gls{facade}. It
+contains the following classes:\noparbreak
\begin{description}
- \item[SDLContext] This is a facade around the \codeinline{SDL2} library which is used around different parts of the engine,
- and is therefore implemented as a singleton.
- This class is friends with \codeinline{Texture}, \codeinline{LoopManager}, \codeinline{RenderSystem} and \codeinline{AnimatorSystem}.
- \item[Texture] This is a wrapper around the \codeinline{SDL_Texture} class, and uses
- cr\^epe's \codeinline{Asset} class to load an Texture instead.
+ \item[SDLContext] This is a facade around the \codeinline{SDL2} library which is
+ used around different parts of the engine, and is therefore implemented as a
+ singleton. This class is friends with \codeinline{Texture},
+ \codeinline{LoopManager}, \codeinline{RenderSystem} and
+ \codeinline{AnimatorSystem}.
+ \item[Texture] This is a wrapper around the \codeinline{SDL_Texture} class, and
+ uses cr\^epe's \codeinline{Asset} class to load an Texture instead.
\end{description}
\begin{figure}
\centering
+ % TODO: export as vector format instead
\includegraphics[width=\textwidth]{img/texture.png}
\caption{User texture class diagram}
\label{fig:class-texture}
\end{figure}
-
\subsection{AssetManager}
-The AssetManager is a \gls{api} class that the user can use to make a \codeinline{Asset} available from different scenes.
+
+The AssetManager is a \gls{api} class that the user can use to make a
+\codeinline{Asset} available from different scenes.
\subsubsection{Architecture}
-\Cref{fig:class-assetmanager} shows a class diagram of the AssetManager. It contains the following classes:
+\Cref{fig:class-assetmanager} shows a class diagram of the AssetManager. It contains
+the following classes:\noparbreak
\begin{description}
- \item[AssetManager] is a Singleton class, meaning only one instance of this class exists throughout the application.
- This ensures a single point of access and control over asset management, simplifying resource handling and avoiding duplicated assets in memory.
+ \item[AssetManager] is a Singleton class, meaning only one instance of this class
+ exists throughout the application. This ensures a single point of access and
+ control over asset management, simplifying resource handling and avoiding
+ duplicated assets in memory.
\end{description}
\begin{figure}
\centering
- \includegraphics[width= 0.5\textwidth]{img/AssesManager.png}
+ % TODO: export as vector format instead
+ \includegraphics[width=0.5\textwidth]{img/AssesManager.png}
\caption{User AssetManager class diagram}
\label{fig:class-assetmanager}
\end{figure}
\subsection{Rendering}
-Every game engine has an rendering structure to present all the different enities and components on the screen.
+
+Every game engine has an rendering structure to present all the different enities and
+components on the screen.
\subsubsection{Architecture}
-\Cref{fig:class-rendering} shows a class diagram of the RenderSystem. It contains the following classes:
-
-\begin{itemize}
- \item The system architecture is centered around rendering and component management, with the following key components:
- \begin{enumerate}
- \item \emph{System} - an interface class, containing the virtual \codeinline{update()} function.
- \item \emph{RenderSystem} - a derived class of \codeinline{System} responsible for rendering operations. \end{enumerate}
- \item The \codeinline{System::get_instance()} function provides a static, singleton instance for managing system-wide operations.
- \item The \codeinline{RenderSystem} class implements various rendering functions:
- \begin{itemize}
- \item \codeinline{sort_layers()} - organizes the rendering layers.
- \item \codeinline{clear_screen()} - clears the screen prior to rendering.
- \item \codeinline{update_sprites()} - updates sprite positions and states.
- \item \codeinline{update_camera()} - manages the camera view.
- \item \codeinline{present_screen()} - presents the final rendered image to the screen.
- \end{itemize}
- \item The \emph{SdlContext} class, another singleton, manages the \gls(SDL) and has a friendship relationship with \codeinline{ComponentManager}
- for tighter integration with component management.
- \item Components are organized as follows:
- \begin{itemize}
- \item The \emph{Component} base class allows for generic handling of components.
- \item Derived component classes include:
- \begin{itemize}
- \item \emph{Sprite} - represents visual elements with attributes like \codeinline{sprite},
- \codeinline{color}, \codeinline{flip}, \codeinline{sortingLayer}, and \codeinline{orderInLayer}.
- \item \emph{Transform} - manages positional attributes, including \codeinline{position}, \codeinline{rotation}, and \codeinline{scale}.
- \end{itemize}
- \end{itemize}
- \item Both \codeinline{Sprite} and \codeinline{Transform} components provide a \codeinline{get_instances_max()} function to retrieve the maximum instance count.
+
+% TODO: anyone read this?
+\Cref{fig:class-rendering} shows a class diagram of the RenderSystem. It contains the
+following classes:\noparbreak
+\begin{itemize}
+ \item The system architecture is centered around rendering and component
+ management, with the following key components:\noparbreak
+ \begin{description}
+ \item[\codeinline{System}] An interface class containing the virtual
+ \codeinline{update()} function.
+ \item[\codeinline{RenderSystem}] A derived class of \codeinline{System}
+ responsible for rendering operations.
+ \end{description}
+ \item The \codeinline{System::get_instance()} function provides a static, singleton
+ instance for managing system-wide operations.
+ \item The \codeinline{RenderSystem} class implements various rendering
+ functions:\noparbreak
+ \begin{description}
+ \item[\codeinline{sort_layers()}] Organizes the rendering layers.
+ \item[\codeinline{clear_screen()}] Clears the screen prior to rendering.
+ \item[\codeinline{update_sprites()}] Updates sprite positions and states.
+ \item[\codeinline{update_camera()}] Manages the camera view.
+ \item[\codeinline{present_screen()}] Presents the final rendered image to the
+ screen.
+ \end{description}
+ \item The \codeinline{SdlContext} class, another singleton, manages the \gls{sdl}
+ and has a friendship relationship with \codeinline{ComponentManager} for tighter
+ integration with component management.
+ \item Components are organized as follows:\noparbreak
+ \begin{itemize}
+ \item The \codeinline{Component} base class allows for generic handling of
+ components.
+ \item Derived component classes include:\noparbreak
+ \begin{description}
+ \item[\codeinline{Sprite}] Represents visual elements with attributes like
+ \codeinline{sprite}, \codeinline{color}, \codeinline{flip},
+ \codeinline{sortingLayer}, and \codeinline{orderInLayer}.
+ \item[\codeinline{Transform}] Manages positional attributes, including
+ \codeinline{position}, \codeinline{rotation}, and \codeinline{scale}.
+ \end{description}
+ \end{itemize}
+ \item Both \codeinline{Sprite} and \codeinline{Transform} components provide a
+ \codeinline{get_instances_max()} function to retrieve the maximum instance count.
\end{itemize}
\begin{figure}
\centering
+ % TODO: export as vector format instead
\includegraphics[width=\textwidth]{img/Rendering.png}
\caption{System Rendering class diagram}
\label{fig:class-rendering}
\end{figure}
\subsubsection{System}
+
\begin{figure}
\centering
+ % TODO: export as vector format instead
\includegraphics[width=\textwidth]{img/flowchart_rendering.png}
\caption{System Rendering flowchart }
\label{fig:class-renderingflowchart}
\end{figure}
-
% \subsection{Physics}
\subsection{Scripting}
@@ -386,36 +416,36 @@ contains the following classes:
A \gls{poc} for the final Audio \gls{facade} is also showcased in \cref{poc:audio}.
% \subsection{Save manager}
-%
+%
% The save manager \gls{api} is designed to give the game programmer an easy to use
% interface for retrieving and storing game-specific data (\cref{req:savemgr}).
-%
+%
% Because the engine validation app only stores statistics and highscores, the save
% manager is not required to support loading different save files
% (\cref{req:savemgr:multi-file}), nor storing complicated data types
% (\cref{req:savemgr:types-custom}). The save manager only supports storing simple
% types (\cref{req:savemgr:types-scalar,req:savemgr:types-string}).
-%
+%
% In order to reduce complexity for the game programmer further, the following
% requirements were also set:\noparbreak
-%
+%
% \begin{itemize}
% \item Prevent data loss in the case of crashes (\cref{req:savemgr:journalling})
% \item Handle opening/closing/flushing of the underlying file automatically
% (\cref{req:savemgr:file-manage})
% \item Save file variables are uniquely identified (\cref{req:savemgr:var-key})
% \end{itemize}
-%
+%
% \subsubsection{Architecture}
% \label{sec:savemgr:architecture}
-%
+%
% \begin{figure}
% \centering
% \includepumldiag{img/class-savemgr.puml}
% \caption{Save manager class diagram}
% \label{fig:class-savemgr}
% \end{figure}
-%
+%
% In order to realize \cref{req:savemgr:journalling,req:savemgr:var-key}, a third-party
% key-value database library is used.
@@ -525,31 +555,38 @@ repository, under the \codeinline{src/example/audio_internal.cpp} file.
\subsection{Camera}
\label{poc:camera}
-The camera \gls{poc} \autocite[camera example]{crepe:code-repo} consists of
-the following:\noparbreak
-
+The camera \gls{poc} \autocite[camera example]{crepe:code-repo} consists of the
+following:\noparbreak
\begin{itemize}
- \item An \codeinline{on_key_pressed} function, which listens for key presses and adjusts camera position and zoom based on key inputs.
- \item A user-defined script class (\codeinline{MyCameraScript}) derived from \codeinline{Script}, implementing only the \codeinline{update()} function.
- To update the camera movements and zoom.
- \item A main function that—
- \begin{itemize}
- \item Subscribes the \codeinline{on_key_pressed} function to handle \codeinline{KeyPressedEvent} events.
- \item Creates a \codeinline{GameObject} for the camera and adds \codeinline{Camera} and \codeinline{BehaviorScript} components,
- with \codeinline{MyCameraScript} attached to manage the camera’s transformation.
- \item Instantiates a background \codeinline{GameObject} with \codeinline{Transform} and \codeinline{Sprite} components, loading an external texture as its background.
+ \item An \codeinline{on_key_pressed} function, which listens for key presses and
+ adjusts camera position and zoom based on key inputs.
+ \item A user-defined script class (\codeinline{MyCameraScript}) derived from
+ \codeinline{Script}, implementing only the \codeinline{update()} function. To
+ update the camera movements and zoom.
+ \item A main function that---
+ \begin{itemize}
+ \item Subscribes the \codeinline{on_key_pressed} function to handle
+ \codeinline{KeyPressedEvent} events.
+ \item Creates a \codeinline{GameObject} for the camera and adds
+ \codeinline{Camera} and \codeinline{BehaviorScript} components, with
+ \codeinline{MyCameraScript} attached to manage the camera's transformation.
+ \item Instantiates a background \codeinline{GameObject} with
+ \codeinline{Transform} and \codeinline{Sprite} components, loading an
+ external texture as its background.
\end{itemize}
\end{itemize}
-Running this \gls{poc} allows for controlled camera movement and zoom in response to key inputs. The \codeinline{MyCameraScript::update} function ensures that these transformations are applied each frame, as demonstrated by the output in \cref{fig:poc-output-camera}.
-
-
+Running this \gls{poc} allows for controlled camera movement and zoom in response to
+key inputs. The \codeinline{MyCameraScript::update} function ensures that these
+transformations are applied each frame, as demonstrated by the output in
+\cref{fig:poc-output-camera}.
\begin{figure}
\centering
\fitimg{\includegraphics[scale=0.7]{img/poc-camera.pdf}}
- \caption{camera \glsfmtshort{poc} output}
+ \caption{Camera \glsfmtshort{poc} output}
\label{fig:poc-output-camera}
\end{figure}
+
\end{document}