| Tags: game development post-mortems

This weekend I joined Ludum Dare, a 48h solo game jam. The challenge was to create a game from scratch (code, graphics, audio…) in just 48h following a theme: "Shape shifting".

This is the post-mortem of Sky Panic, a cute'em-up with pixel art graphics. You can play and rate the game from the Ludum Dare website, and also take a look at the source code on Github.




I woke up early (7:30 AM) to see the theme, since the jam starts at 3 AM in Europe. Unfortunately I quickly discovered that I was feeling like crap: headache, nasal congestion, stomach pain… It felt like my body was fighting some kind of flu/cold bug. I like to start my jams by doing some kind of exercise (usually a light run), but I settled for a walk outdoors instead.

I brought a notepad and pen with me and started to create a mind map of the ideas I could come up related to the theme. I came up for some ideas I liked, but they required quite a big amount of assets or game design, so I wouldn't have time to implement them during the weekend.

My mind was really clouded because of the headache, which didn't help. In the end, it was around lunch time, so I decided to cook a chicken stew, and decide on an idea while having lunch. And the winner was… A cute'em-up! It's a variation of the classic 2D scrolling shooters (not FPS), only with a cute theme / art.

I had prepared beforehand the Github repository and created the initial scaffolding with the help of my game jam template generator.

Development that evening was slow but steady. I took plenty of breaks to rest: I played a few Hearthstone games, read some articles, watched some TV-show episodes… I didn't want to overdo it and fall really sick.

By almost 5PM I had already a ship that shot bullets. It seems simple, but this first step serves to set up some systems I needed in place: how to handle movement, getting player's input, implement a sprite pool, etc.


Note that although I was just using placeholder graphics, I already decided on a palette / mood. All the sprites of the game would be created with PICO-8 16-colour palette, which I personally love.

The next step was to create enemy waves that would follow a pre-determined path. Although there is a motion paths tutorial for Phaser, I didn't quite like the fact that the example plotted every single possible pixel. The paths I had in mine weren't that complicated, so in the end I just ended up creating a series "waypoints" the enemies will reach one by one.

An old-school trick to make a sprite reach a point is to ease out that movement at the end so the sprite ends up really, really close and you can finally "snap" (or round up) its position to the target.

This is an snippet from the source code. Here I'm also clamping the maximum speed so the easing only takes effect when the distance to the target is close.

if (distance > FUZZY_EPSILON) {
let angle = this.game.math.angleBetween(this.x, this.y, target.x, target.y);
let coeff = Math.min(distance * 0.05, 1);
Math.cos(angle) * MOVE_SPEED * coeff,
Math.sin(angle) * MOVE_SPEED * coeff

By dinner time I had already some flying enemies spawned in waves, following a motion path. I also implemented a simple flashing animation for when the enemies get shot (they can sustain multiple hit).


And right before going to bed (around 11:30 PM) I implemented the shape-shifting mechanic. You can switch to bomber mode to shoot bombs instead of bullets! The idea would be to use this weapon to kill enemies in the ground.



I overslept, but I don't regret it because my body really needed it. Once again, I went outdoors to have a walk and get some sunshine. Right before lunch I managed to implement some ground enemies –which I called crawlers– that would shoot at you and you needed to shape-shift to bomber mode to finish them.


This was beginning to look more like a game! I implemented the score, infinite enemy spawning and a game over condition. I then added some basic sound effects I quickly created with an online synth, and uploaded this first playable version to my server so other people could play it.

Score and game over

I also created a simple background music loop, which is short, but has a bass line I like.

Once basic gameplay and audio was in place, I could finally start doing some art! These are some samples:



I'm also quite proud of the explosion animation –it was the first time I was drawing one! I decided to go for this approach because I wasn't confident to be able to implement particles on time (and I was right!).


As you can see, I added some clouds. These serve to create the illusion of a scrolling background.

I uploaded this version with final graphics so people could test for some crashing bugs. I was lucky there were none! To finish my entry, I added a splash screen with controls information and uploaded the game to some mirrors (Github Pages and my page at itch.io).

I did it! A game in just 48 hours!

What went wrong

What went well

Tools & tech

Don't forget to play the game!