My First LD Postmortem: “Hymn of the Moles”

Posted by
April 28th, 2014 8:54 pm

So uh, Ludum Dare. This is the first LD Jam that I entered and…
well, it was okay!

My game wasn’t overly ambitious (it was pretty minimalistic even in its design stage), so I was actually able to complete it.

What went right:

  • Music! Somehow I was actually able to transcribe the songs relatively quickly.
  • Art! I mean, it wasn’t perfect, and for having a total of 5 sprites in the entire game (with one of them being a solid white square), it took a long time to do. But it came out pretty great. Instead of finding existing art and trying to “8-bitize” it by adding pixellation and posterization to it, I actually created the art from scratch (but based on existing art I could find). I created it on a 162×190 canvas before stretching it out to a 640×480 canvas, to create a somewhat authentic Atari 2600 look. I then took the actual Atari NTSC palette and replaced all the colors.
  • The Beat! In the game there is a steady beat going on and things react to it. I tried creating the beat on a timer, as each beat is approximately 918 milliseconds apart, but eventually the timer would become desynced. In the end, I decided just to analyze the audio file playing and sync all the beats to that, and it worked perfectly! Slightly hacky, and it could be way better designed, but it guaranteed perfect beat synchronization. Speaking of synchronization…
  • Gameplay! Although I could touch up on some things, the Gameplay is rather solid. The game plays nice and level transitions are pretty great, in my opinion.

What went wrong:

  • Individual Note Synchronization. It’s a mess. Note objects are created on the beat, but are timed via a timer. To keep them from getting off-sync by the time they reach their targets, on each beat, the notes would resync to where they’re supposed to be. Sometimes, a 10 millisecond audio delay would cause notes to incorrectly sync too early or late, which was obviously very confusing. Also, due to the way I calculate the beat, eighth notes could not sync, lest they instantly become quarter notes. In the end I had to create a system that determined whether or not a note needed to be synchronized, as well as how lenient synchronization should be. God, it’s just a mess!
  • The Audio System. Well, it turned out right. But a small bug chewed up at least 2 hours of my time. The Audio System itself works flawlessly, to my knowledge anyway. What didn’t work out was the random audio files that play when you hit a note. I had an array of possible filenames to play, but I left out initial “sound/” part of the path, as well as the “.wav” extension, so I could just concatenate them and save a small bit of memory, maybe. Well, this concatenation ended up creating a temporary string which was destroyed after it left the scope. The problem was that elsewhere this path was stored, ready to be played again. But since the string was destroyed, the memory got overwritten by other data, resulting in the audio files playing, but not being loaded and destroyed properly. It was horrible.
  • Level Design. So this game is just a rhythm game, so it doesn’t require any complex level design. Well, I took that to my advantage by hard-coding all levels into arrays and functions. But god, is it ugly and hard to work with it. I literally just have a “level” variable and a function that uses a switch statement to generate different notes for each level. I wanted to at least embed Lua to read scripts for all the levels and make it less messy, but I ran out of time.
  • Sound files. So, I created a bunch of files for the different notes that play during gameplay. Well, the pre-programmed songs required notes out of the range I initially created, and I didn’t have enough time to recreate them perfectly, so I had to go into audacity and change the pitch of existing files. These files sounded lower quality and are rather noticeable and ugly sounding.
  • Object-Oriented Design. Well, this tends to be somewhat unavoidable at times. Basically, everything started off real great and clean, but as time went on my classes became more and more convoluted with random variables and strange constructor parameters and all kinds¬† of messy, improvised designs. It’s a bad programming habit. But it’s not all my fault. I mean, I had a time limit!
  • Porting, kind of. I have no Windows port yet. And it may take a while, as I have not set up my game to compile on Windows yet. Visual Studio confuses me with the linking and everything. So this may take a while to properly port so a majority of users can actually play the friggin’ game!

What I learned:
Const Char* values are still pointers
Visual Studio needs to be set up properly!
 Working alone is more challenging than it seems

Hymn of the Moles



Leave a Reply

You must be logged in to post a comment.

[cache: storing page]