Here's some advice that I really ought to get tattooed on my forearm:
The hardest part of game development is when you stop brainstorming and start building. So when you're in doubt — and you will be in doubt — begin by building the absolute simplest version of your game.
I've been stumped on how to take a game idea I've been designing for years on paper from mere concept to a functioning, interactive computer game.
Yesterday, after chatting with some friends at the Wayward Game Developers meetup I help run here in Portland, I realized I've been paralyzed for years by doubts about where to start building. The game I want to create has some pretty complex systems that have to do with the passage of time and the rate at which certain variables increment or decrement based on multipliers. Trying to track it all on paper is barely manageable, so when it came time to plan out a game engine, things quickly became overwhelming.
But this morning, I forced myself to confront that anxiety and asked: "What is the absolute simplest version of my game?" And in that context, it was simple: "I need a game engine that tracks an object as it travels at a fixed velocity for a fixed number of miles." And at that moment, I realized how simple this fundamental problem really was: I just needed a counter system that posts an update to the player at a fixed rate.
method. In plain English, it's a simple, built-in way to perform a certain action — defined as a callback function — every time that a set number of milliseconds has elapsed.
When I first ran the game, it was a profoundly mundane experience: line after line dumped into the Node.js console depicting how many minutes had passed and how many miles had been traveled. But it did what it had to — it ran at a fixed rate and it stopped when I hit a predefined number of miles.
I know this probably sounds ludicrous, but that moment was almost sublime — seeing something I'd had such a hard time articulating running before my eyes. And it only took about a dozen lines of code!
Once that absolute basic skeleton of my game was defined and built, adding the next layers was an intuitive and joyful set of problems to solve. I defined points of interest at fixed numbers of miles along the journey, and every time the player passed through one of them, a unique status update was displayed in the console. Ideas just started flowing, and I could barely keep up with implementing one before another struck me.
This morning, I felt like I was staring down a blank wall of impossibility. But by forcing myself to simplify the problem down to its absolute core, I suddenly understood how to start — and that made all the difference.