People on the Ludum Dare website seem to love doing these post mortem things.
So, without further ado, here's my post mortem on creating Existence.
I mentioned in the first post that I entered the compo on a spur of the moment decision, without any real preparation. This isn't quite true. I've looked at creating a component entity system for a while now...I just haven't had any success with it.
Tip 0: Be prepared
In reality, I've been thinking about how I wanted to set one up, which made it easier for me to get started. I'm also a developer in my day job, so I'm somewhat experienced with how to handle looming deadlines.
Nevertheless, it was still a challenge.
I wanted to create a game from scratch, no matter how long or complex, just to see if I could do it.
I've tried to create a game in the past, but for one reason or another, I lost interest. Most of the time it was because of something unrelated to the game itself or I would go down a rabbit hole trying to make something too...perfect.
This was basically a way of testing my ability to cast aside some of my weaknesses and actually complete something.
The game engine
Creating a game engine from scratch obviously puts me at a disadvantage compared to someone who uses something full featured like Unity. It cost me time to create something that would do such basic things like running a game loop, parsing a sprite map, loading a map and drawing to a canvas.
My engine couldn't even play a sound or have a good way to load another screen. Heck, I couldn't find a simple way to 'reset' my game after playing it without having to resort to the web browser's refresh feature. Although...that is exactly what the refresh button in a browser is supposed to do!
Revelations like that are part of the reason I learned so much during this 48 hour development period. If you think about it, it's basically the same as hitting the good ol RESET button on an NES.
Tip 1: Know your tools
As a web developer, refreshing the page or redirecting is the ultimate reset button. We don't really like doing it but it's there if needed. In a pinch, it works like a charm.
Creating my own engine meant I knew what was possible at any given time. I wasn't hit with any nasty surprises. I wasn't restricted to doing things in a particular way. I knew where to extend it and didn't really have to fight with it to see how something was "supposed" to be done.
The drawback was that I had to create it. If I was proficient with some kind of framework, you better believe I would've used it :D
I spent quite a bit of time on the game engine and didn't think too much about the theme, at first. There was no point in spending all my time thinking about a concept when I couldn't paint any pixels on the screen. As I finished some of the initial setup, things started to fall into place.
Tip 2: Don't get sidetracked
As I started seeing what was possible, I focused my ideas on what could be done with the time left.
For instance, I wanted to do something more than I had done on the final screen. But I didn't even have an ending screen. In order to 'finish' the game, it needed an ending screen, no matter how simple it was. The primary goal was to finish a game.
I didn't have a good way of displaying screens with the normal game loop, so I had to resort to some hackery. I'm not too proud of it but sometimes dirty things need to be done :p
In the end, the theme had to do with having one "life", which is so cliché but at least it was achieved in a unique way (I think).
The game itself
I was very pleased with how it turned out.
The game was only 3 screens, which doesn't seem like much, but I was able to add some depth to it. I didn't want the player going from screen to screen collecting 'x' items or destroying 'y' monsters. There wasn't much of a story but each room gave you a sense of discovery and purpose.
Here's a (non-exhaustive) list of features:
- multiple maps (3) linked together
- action button to interact with characters and items
- multi directional shooting
- multiple weapons with different properties (wind, fire)
- weapon type immunities (you can burn down the world tree but wind doesn't hurt it)
- npc ai scripts
- treasure chest (that tell you what was in it after you open it)
- damage animation (when you get hit, blood flies out)
- hp bars
- moving between screens saves the state (number of enemies, treasure, etc)
- multiple endings!
All of this and the game is pretty smooth with no real bugs!
Which brings me to my next lesson.
Tip 3: Practice!
I don't create games (often) but I do develop a lot. I've learned a few techniques here and there and continually try to practice my skills.
When you complete something, take the time to reflect upon it. Was there anything you didn't like? What's a better way of accomplishing what you've done? How have other people accomplished the same tasks?
Do some research. The best way to learn is by reading about other people's experiences and see how they do things.
I couldn't have gotten this far without all of the experience I've gained over the years and all of the valuable resources available. The internet is a gold mine of information.
Speaking of resources, I also created a walkthrough and a guide of sorts for people to know what each character represented in the game. Judging by the comments, it proved useful to at least a few people, which makes it worth it.
I would not change how any of this went. I was able to stay focused and complete my goal of creating a playable game, no matter how short it ended up being.
I will probably enter future Ludum Dares because it was so enjoyable :D
I've already posted so much about my experience but I wanted to capture as much about it as I could.
I have at least one more post in me about the actual game engine if anyone's interested.