Rocket Rabbit: The Post Mortem

Posted by
April 22nd, 2015 2:57 pm

Going into Ludum Dare, I knew I wanted to make a shmup. I needed to come up with an unconventional weapon, though. I decided on carrots, and what better protagonist to have than a rabbit that shoots carrots? Initially with the theme I thought I’d make a light-hearted game with bright colors and a ridiculous setting a la Parodius, but…

Rocket Rabbit

I worked on the game a bit and got bullets and enemies in. After that, I composed a lighthearted track for the first stage then started working on boss music. The boss music came out super tense and action-y. It conflicted with the stage 1 track, and I liked it a lot more. This was Saturday evening mind you; I didn’t really have time to produce any more music, so I said screw it, the game is going to be more serious. I scrapped the first track and started building the game around the boss music.

Then came the assets to replace my placeholder art. I turned on the boss music and just did this stream of consciousness sort of thing, drawing whatever came to mind. “This is tense; let’s add some blades,” and everything went downhill from there. Suddenly everything was made of metal and it was going to be hardcore.

 

blade4x2

The Blade, a whirling, fast enemy that charges straight at the player while firing barrages of bullets. I really hated this guy during playtesting.

 

I’m a programmer, not an artist. It takes a long time for me to make one asset. This was my first time manually rotating a fairly complicated sprite. This guy took at least an hour to finish, which is a ridiculously massive timesink in the grand scheme of things. Looking back, some of the shading is messed up, mainly around the center disc.

 

player4x

That rabbit is wearing goggles and a scarf. You know he means business.

 

I had an awful time just getting the player sprite to look passable, as you can see in the timelapse around ~4:00. Getting the illusion of depth was hard and lots of dithering conflicted with the style of the rest of the game. Eventually I opted to just layer sheets of hard-edged metal on top of each other and it seemed to work OK.

 

The Bad

 

The thing that hits me *every* LD is that I haven’t allocated my time as best as I could. 48 hours is a REALLY strict time limit. You really need to know which corners you can cut and which ones you can’t. Polish is extremely important, and you need to leave time for it!

The number one complaint I got is that there is no visible feedback for hitting enemies with >1 HP. This would have been a nice addition, but I was so caught up implementing core functionality that I didn’t even have time think of it.

Among other things I thought of that I wish I could have implemented:

  • A longer stage 1
  • A second stage (!! getting ambitious there)
  • HP bar for bosses. I actually thought of this towards the end, but there was an hour left and I needed to leave time to implement a quick menu screen and game over screen and to package up the game. I didn’t know there was a submission hour, so maybe I could have done this.
  • More detailed border during gameplay. Given how long it takes me to do things art-related, this was out of the question.
  • Disappearing carrots from the player’s ship

 

The Good

 

  • Art skill leveled up! It was my first time doing somewhat detailed animations for LD. It was also the first time that I worked with higher resolution art (typically I stick to 8×8, 16×16, or 32×32).
  • Music skill leveled up! It was my first time producing music for LD.
  • Got a shmup under my belt, a genre which I’ve appreciated for a long time but never seriously attempted to make.

I’m actually really happy with how my entry turned out this time given the time restraints. Some of the code is a bit spaghettified because I needed to add things NOW instead of properly, but it’s nothing that can’t be fixed up. The main thing to remember is that the end user doesn’t care what your code looks like!

Amazingly enough, there were no massive bugs in the Ludum Dare version and everyone I’ve talked to has been able to play the game just fine. There’s only one thing I’ve noticed that is totally off, but you wouldn’t ever know unless you looked carefully: during gameplay, the starfield background is supposed to be purplish, not black. I thought I had made it purple but I never really checked… It was a really subtle problem with the code too:

love.graphics.rectangle('fill', 0, 0, unpack(self.bounds))
 -- which essentially evaluates to love.graphics.rectangle('fill', 0, 0, 0, 0, 600, 700)
 -- the last two arguments are discarded since this function expects mode, x, y, w, h
 -- should have been
 love.graphics.rectangle('fill', unpack(self.bounds))

 

Addendum: Funny Programmer Stuff

 

So alongside my Ludum Dare games I’ve been working on this library meant to complement love2d aptly name hug. There was one thing I was missing from it in my previous LDs that I dreaded reimplementing: animation. I knew I’d need animation for a shmup. During the week prior to LD, I drafted an animation API and put it in a separate branch on github. There are a few key concepts for the API, but the important two are frames and animations (a sequence of frames). A frame has a rectangle that specifies what part of an image it uses, a duration, and a list of attachment points. Imagine being able to say “here’s the point for the left hand on this knight guy, put a sword in his hand.” With attachments, this would be easy. You just get the attachment named “left-hand” and render the sword there.

As it turns out I didn’t need attachments for Rocket Rabbit (although, if I had more time I probably would have designed enemies that shot from points other than their center – attachments would work great there). What I DID need was a way to store arbitrary data per frame: specifically, the radius of a bullet, enemy, or player. “I don’t have time to add this to hug right now, it will take too much planning” I said, so in my moment of brilliance I ended up storing collision radius in the X component of an attachment named “radius.” Yuck. Problem solved, though.

 

Links

 

I’d appreciate it if you’d try out my game and throw me a comment. Anything that helps me improve the quality of my games!

Entry page
Timelapse

Tags: , , , ,


Leave a Reply

You must be logged in to post a comment.

[cache: storing page]