See on GitHub

BubEngine

This project is a recreation of the classic arcade game Bubble Bobble, developed during the Programming 4 course. The goal of this project was to apply and deepen my understanding of game engine architecture. The level loading happens through TMX files created with Tiled Map Editor. The game also keeps track of high scores using a simple text file.


Gameplay

The game includes three fully functional modes:

  • Single Player - Control Bub and defeat enemies across multiple levels.
  • Co-op - Team up with a friend to control Bub and Bob together.
  • Versus - One player controls Bub, the other a Maita enemy.

The game supports both keyboard and gamepad input for all modes, as required by the project guidelines. Players can mute/unmute audio with F2, skip levels with F1, and see a persistent highscore list at the end of the game.

My Custom Engine

The game runs on my own custom 2D engine written in C++. It was developed as part of the exam requirement to understand low-level engine systems. The engine is modular, efficient and organized into separate systems for rendering, input and game logic.

  • Entity-Component System (ECS)
  • Scene management and update loop
  • Input handling for multiple players
  • Collision detection and simple physics
  • Sprite and animation rendering
  • UI and text rendering system
  • Audio via service locator

Design Patterns

To structure and organize the engine, several software and game programming patterns were applied:

  • Game Loop - Ensures consistent frame updates and rendering order.
  • Update Method - Allows each component to define its per-frame behavior.
  • Command Pattern - Used for input actions, supporting both keyboard and controller mappings.
  • Observer / Event System - Enables decoupled communication between components and systems.
  • Component Pattern - Core of the ECS, giving flexibility in game object composition.
  • State Pattern - Used for game states like Main Menu, Playing, Game Over.

Additionally, parts of the engine utilize threading, for example sound management.