For this project, I developed a lightweight 2D top-down shooter built in C++ using SDL2 and the
xcube2d framework. The main focus of the project was designing and implementing my own Entity
Component System (ECS) architecture to manage gameplay systems such as movement, AI, animation,
collision handling, rendering, and projectile management. I wanted the engine structure to stay
modular and component-driven, allowing systems to work independently while keeping the codebase
easier to expand and maintain. Alongside gameplay features, I also implemented layered
rendering, camera smoothing, sprite animation handling, HUD rendering, and audio integration to
give the game a more polished feel overall.
A large part of the project involved solving lower-level engine problems rather than just
gameplay programming. I created a collision system that handled axis-separated movement and
interactions between entities, including pickups, enemy damage, level progression, and
projectile impacts. I also implemented projectile pooling to avoid unnecessary runtime
allocations, improving performance when firing repeatedly. The rendering pipeline was designed
around stable sorting and layer-based drawing so entities would render correctly based on depth
and world position. Throughout development, I spent a lot of time researching ECS architecture,
SDL rendering behaviour, and optimisation techniques, which helped shape the final
implementation.
One of the most valuable parts of the project was critically reviewing my own architecture
decisions after development. While the final result was fully functional, I identified several
areas that would need restructuring in a future iteration, particularly around separating engine
logic from game-specific behaviour and improving scalability within the ECS. That process gave
me a much stronger understanding of engine design, API usability, runtime performance, and how
important planning is when building systems intended for expansion. Overall, the project gave me
hands-on experience developing engine-level systems from scratch and strengthened both my
technical programming skills and my approach to software architecture.