This game engine was built using C# with OpenGL for graphics and OpenTK for window and input management. It features various systems and managers including: audio, collision, physics, rendering, input, entity, resource, and scene management.
The engine is built around the Entity Component System (ECS) pattern. In this system, entities serve as containers for components, which hold basic data such as position, health, or velocity. Systems process this data and execute logic based on it. Additionally, I developed a maze-based game using the engine, where planets pursue the player, and power-ups can be collected to help survive.
Entities hold components such as transform or collision data. These components provide all the necessary data systems need to do their job — e.g. a collision system checking for overlaps based on transform and collider data.
Components hold specific sets of data — like position, rotation, and scale in the transform component. This data is used by systems to run the logic of the game engine.
Systems process only the entities that have the right combination of components. For example, a physics system might look for entities with both transform and velocity components, process them, and apply changes based on calculations.
Managers store and organize data. For instance, the collision manager holds all collision data but doesn't resolve collisions — that logic is game-specific and can be implemented by extending the base manager. In the maze game, the enemy hitting the player triggers a reset, whereas hitting a wall simply moves the player back along the collision normal by the penetration depth.