Zombie Arena
A top-down survival shooter built solo in C++ with SFML, where you fight off waves of zombies across a randomly generated arena.

Zombie Arena is a top-down twin-stick style shooter where the player moves with WASD, aims and fires with the mouse, and survives increasingly large hordes of zombies while managing ammo and health pickups across a level-up loop. I built the entire project solo in C++ using SFML, as a more advanced follow-up to my earlier SFML projects.
Technically, the game is structured with proper class separation, dedicated Player, Zombie, Bullet, and Pickup classes each own their own state and update logic, rather than everything living in main. A singleton TextureHolder caches all loaded textures in a map to avoid redundant texture loading across hundreds of sprites. The arena background is built procedurally using an SFML VertexArray and a tile sheet rather than static images, and zombie hordes are spawned dynamically each round via a dedicated createHorde function, with three zombie types (chaser, bloater, crawler) that vary in speed and health, plus a per-zombie randomized speed variance so hordes don't move in lockstep. The game runs on a state machine (paused, leveling up, game over, playing) to control flow between rounds, and includes systems for bullet pooling (a fixed-size array of reusable Bullet objects), a fire-rate/clip/reload system, and pickup spawning with expiration timers for health and ammo.