It all started with a simple question at the beginning: “I wonder what it takes to build a game engine with Java Swing?” What began as a small project to test Swing’s capabilities, just a single level and an animated player character, has since spiraled into the most ambitious and educational project of my student life. This is the story of “Merciless Warrior,” my journey from a simple curiosity to building a solid gaming platform.

A Custom 2D Engine
I intentionally chose Java Swing for the game client. I wanted to understand the fundamentals, to build an engine from the ground up without relying on frameworks like Unity or Godot. This meant creating everything: the game loop, state management, rendering pipeline, physics, and asset handling.
The project quickly grew from a simple player walking on a platform to a feature-rich 2D platformer with:
- A deep combat system with melee attacks, special abilities, and spells.
- Challenging enemies and boss fights.
- An inventory system with crafting, shopping, and looting.
- Character progression through perks and quests.
This path was filled with mistakes. I had many breakdowns dealing with bugs and hard refactoring. My initial code was dirty and many components were so tightly coupled that I couldn’t code normally. As features were added, the complexity snowballed, and some refactors took as long as three months. The breakthrough came when I re-architected the core using an Event Bus and a form of Dependency Injection to simplify things. It was a difficult migration, but I somehow did it, and the improvement in code quality and maintainability was massive. It was through this process of trial and error that I truly learned the value of good software architecture.
The Solo Developer Grind
Working alone meant the challenges went beyond just code. Since I’m not a pixel artist, finding suitable assets was a major hurdle. It wasn’t just about finding art, but finding art with a consistent style that made the game world feel coherent. Sourcing music and sound effects that fit the atmosphere was equally difficult. And then there was level design… ah. Crafting levels that are fun, fair, and engaging is an entirely different skill set. These non-coding tasks were a significant part of the grind, but essential for creating a complete experience.
The Turning Point - From a Game to a Platform
As the game client matured, so did my ambitions. I wanted features like cloud saves, user accounts, and leaderboards. A simple monolithic backend wouldn’t do justice to the complexity I envisioned. This was the turning point where “Merciless Warrior” began its transformation into a full gaming platform, built on a distributed backend.
The backend is a powerful, event-driven system designed for scalability and resilience, running entirely in Docker containers.
It’s a complete microservices ecosystem:
- API Gateway - unified entry point for all requests from the game client.
- Service Registry - allows services to discover each other dynamically.
- Auth Service - handles secure authentication, with rate limiting using Redis.
- Game Service - the core of the backend, managing all game data.
- Multiplayer Service - the latest addition, currently in development.
The Data Pipeline - From Gameplay to Insight
One of the most exciting parts of this project was building a complete data pipeline to analyze gameplay events in real time.
The architecture is event-driven:
- The Game Service produces events in Avro format to an Apache Kafka topic.
- The Analytics Service, written in Scala, consumes these events.
- A Spark Structured Streaming job processes the data in near real-time, writing it to a partitioned, Parquet-based Data Lake.
- An on-demand Spark Batch Job can then run complex analytical queries on this data lake
This pipeline decouples the game’s operational logic from its analytical needs, creating a scalable system capable of handling vast amounts of data.
The Journey So Far
Now, as a final-year student, looking back at the project, I see more than just code. I see a journey of learning and perseverance. What began as a simple experiment became a piece spanning game development, backend engineering, and data pipelines.
Every challenge, from physics bugs in Swing to ensuring transactional consistency in a distributed system, has been an invaluable lesson. This is the key point: I learned so many things here that the faculty could never teach me. I can learn pure theory on courses, at university, or from YouTube, but practice is a totally different beast. The project is a testament to the idea that starting small, driven by curiosity, can lead to something far bigger than you ever imagined. And with multiplayer on the horizon, the journey is far from over.