A small game built without an engine, to practice the game loop, entity behaviour, collisions, the camera, loading resources and native C++ builds.

Gameplay

The player moves around a tiled world and shoots arrows in the last direction they moved. Enemies chase the player, each wave is bigger than the last, and after clearing one you pick an upgrade before the next starts.

  • Classes for the player, enemies, arrows, cells, the grid and screens.
  • Health, waves, fire rate, movement, camera and collisions.
  • Menus and upgrade selection built with Dear ImGui.

Technical side

Working directly on raylib meant the game itself owns the main loop and all its state. CMake downloads and links raylib, Dear ImGui and rlImGui, and asset paths are set at compile time so the game finds its resources wherever it's launched from.

What I learned

I saw first-hand how the order of initialisation and updates, and who owns each object, affects real-time software. I also hit collision and state-change bugs that an engine usually hides from you.