First Game Jam Postmortem
I've been wanting to make video games since before I was able to read, and during my childhood, I've made a few "games" (basically prototypes or proofs of concept) in QBasic and a variety of PC game-making tools (such as they were in the early 90s). Later I played around in Visual Basic, RPGMaker 2000, and even later PyGame, but never finished a single game... and in the last 10 or so years, I barely even started any projects.
So when the Tutorial Jam came around, I needed a little encouragement, but I signed up in the end. When it suddenly and surprisingly began (you see how invested I was in it, I didn't even write down the date), I was actually... going for it.
So this is it. My First Game Jam Postmortem!
The Tutorials
I scanned the list of tutorials linked in the jam description, and after considering the Godot and Haxepunk ones for a short while (I've been wanting to give those engines a try), I settled on Pico-8, because I knew that it came in a single executable with everything built-in, and I clearly needed a low barrier to entry! The less setup I have to do before I can start making games, the better.
Also, thanks to a Humble Bundle years ago, I owned a copy which had been gathering virtual dust.
Day 1
I followed the tutorial pretty faithfully, occasionally jumping ahead a bit, making the sound effects a little bit fancier, adding an original piece of... "music" for when you lost your last life, and a title screen as well as a "Game Over" screen that shows your score. At the end of the day, I had a surprisingly fun game!
Programming
I enjoyed how simple everything was in Pico-8 (well in Lua, I guess, the programming language Pico-8 uses). All variables are global by default, and the tutorial used pure Imperative Programming, which really helped me focus on the game logic and suppress my instincts to make everything Object Oriented and try to sneak in Functional Programming.
I did use a tiny amount of "objects" (though they're tables in Lua, of course) to implement the title/menu screen and the "Game Over" screen. The main game loops (_draw
and _update
), simply call the functions draw()
and update()
of the gamestate
table. I then created additional tables called game
, menu
, and gover
, gave them update
and draw
functions, and then all I had to do was assign one of them to gamestate
.
Except for that, it's all pure Imperative Programming with global variables! It probably won't scale all that great (Pico-8 limits the game size anyway), but it was a lot of fun, and quick, and easy!
"Art"
The "art", such as it is, is all taken straight from the tutorial. All I did was to make sure that the text on the title and "Game Over" screens was more or less centered.
Sound Effects and "Music"
Those I did do 100% by myself without any help or instructions. The music is only a second long, but I honestly like how it all turned out!
Results
You can play the game as it was on the evening of day 1 here!
Screenshots
As you see, I called it "Squashy with menu". "Squashy" was the title the tutorial gave the game, and while it didn't feature a menu yet, having a title screen was the first step to getting there.
Day 2: The Basics
Now that I had a running game, I was getting ambitious. I was lying awake thinking about how to improve my game, coming up with wild ideas, mostly revolving around the fact that I had six buttons to play with, but only needed two to move the paddle.
So early the next morning (way too early for a Saturday!), I got to adding what I felt were necessary improvements for a more complex game.
Programming
I made the collision detection take the ball size into consideration, so that there would (hopefully) be no more situations where it looks like you caught the ball but still lost a life. I made the ball fly off in a random direction at the start (but always up, so you have more time to move your paddle to catch it). Instead of just reversing direction when the ball went past a wall or the paddle, I made the ball actually stop at whatever it hit instead of going through it, and then reversed its direction. Basically I just did a little bit of math in several places.
I also decided to add only one point every time the ball hit the paddle instead of ten. That saves precious screen space!
And, to free up the cursor keys, I changed the controls to use the two "action buttons" to move the paddle. Usually these are Z and X, but there are several alternatives, I prefer playing this version of the game with N and M.
Lastly, to make the game more challenging, I made it so the ball speeds up every time it hits the paddle!
Art
To make sure I have the whole playfield for whatever I was going to do next, I moved the two UI elements - the score and the lives - into the paddle. For that I had to make new heart sprites, since there is not a lot of space in the paddle, and several hearts would take up too much of it. For the score I chose the nicest blue!
"Music"
I added another very short piece of "music", which plays when a new game starts. That was really just added because the button you pressed to get from the title screen to the game would still register as pressed when the game began, and the paddle would move before you'd meant to move it. Just forcing you to wait through an annoying ditty was the easiest - and dirtiest - solution that I came up with.
Luckily, I got rid of that on day 3!
Day 2: The Ambition
Now that I had the cursor keys freed up, what could I do with them...? How about using them to control on which edge of the screen the paddle is!? Have the paddle at the top! The left! The right! Or even the bottom!
Which only makes sense when the ball can fall out on any side of the screen!
Of course, you couldn't be expected to know exactly which side you'd have to be on when the ball heads into a corner, so I had to add corners for the ball to bounce off of!
... and that's where the problems began
Art
We'll start with art this time. Drawing corners was easy. Though not quite as easy as I thought. But easy enough. I experimented a bit and in the end used two sprites to draw the corners on screen.
Programming
Drawing the corners onto the playfield was easy enough, sprite flipping is supported in Pico-8 after all. Working out the "physics" was simple enough, too, though I wrote it down on a piece of paper to make sure everything checked out - the first time I wrote anything down for this project (keeping everything in my head is probably a bad habit).
But then I got to the collision detection... *deep sigh*
I searched the internet for ideas how to do it the easy way, but either I chose my search terms poorly or there is no easy way. So I started doing it the hard way. I decided to start very roughly, just treat the corner as a square and pretend the ball is bouncing off of that at the angle it would if it had hit a slope. And it worked! For the most part. When the ball was moving slowly, it was visibly not hitting the corner but bouncing off the "air" in front of it. And there were some weird angles at which it would bounce more than once, which looked very odd and made the game unpredictable.
I spent way too much time trying to fix both of these things, but every time I got close to fixing one, the other one got worse.
Furthermore, there was now the possibility of the ball bouncing between two corners indefinitely, so I added a counter for how often it had bounced around without touching the paddle, and gave it a random new direction if that number got too large.
I didn't know what was going wrong, and I got frustrated. I had wasted most of the day on this, and so I went to bed, hoping to find a solution in the morning.
Results
You can play the best working version of what I had on day 2 here.
Screenshots
As you can see on the second screenshot, the gameplay was a mess. You can see the ball getting "stuck" between two corners (while never actually hitting the lower left one and clipping into the upper right one), then it gets a random new direction to "unstick" it, and in the end I lose health even though the ball seems to hit the paddle! But at least you get to see the new health meter and the corners in action.
The title at this point was "You have 1 paddle", which was a bit of a pun on a famous saying about a creek.
Day 3
I woke up on Sunday (too early again!) with the plan to just take the working game that I had around noon on Saturday, and polish it until it shined! Thus the name "Polished Paddle".
Programming
I loaded up an older version from before I added all the corner stuff. (Good thing I made regular backups! Since Pico-8 is all self-contained, I neglected to use an external - which to say any - version control system.)
The only change I made to the actual gameplay was adding the feature that you regain health for every 10 points made.
The rest of it was all polish. I added several difficulties. For each of them, the size of the ball, the starting speed of the ball, and the amount the ball speeds up when it hits the paddle are different. As is the color of the playfield.
I made a real menu where you can select between the four difficulties and a "Help" screen.
I made a "Help" screen!
Art
I made lots of art on Sunday! I made a rainbow sprite to highlight the selected menu entry. It's actually based on the eight color Pride Flag, but the black comes from the menu background... which works out fine because the letters are only 5 pixels tall, so 7 (visible) colors frame them perfectly. I'm not happy with that, but I didn't want to spend too much time on any one thing, like I did on Saturday...
I picked different background colors for the different difficulty settings, the one for "Easy" being the same as the earlier versions (which is the same color as the one used in the tutorial, of course)!
I made a "Help" screen, where I wrote out how to play the game. Then I overwrote the score mentions in the same blue used for the score in the actual game. And I placed hearts at the end of every sentence that mentioned health. And then I animated those hearts accordingly, and made an "empty" heart for when the health runs out completely. I actually added that to the game proper, but had to remove it again when I found a bug with the drawing of it, minutes before I wanted to submit the game to the jam, and I didn't feel like fixing it for something that would only be on screen for less than a second.
And then I made the big graphics for the title and "Game Over" "You Win" screens. I used GIMP and one of my favorite fonts for such purposes: Orbitron. I played around with a few effects, but none of them looked good in 16 colors, so I just painted the title outlines in different colors. And I painted only one edge for the "You Win", because it was getting late. I actually think it looks better that way.
Lastly I added the sparkles. I drew them just on a whim, and I'm super proud how good they actually look! For animating them, I tried different speeds and ended up with each animation frame staying visible for two game frames. And since I had so many empty sprites left over, I decided to use them for timing the animations. There is only a single animation loop, but each sparkle has a different offset to the sprite sheet, so they all go through a bunch of transparent sprites and arrive at the sparkle sprites at different times!
I think the sparkles are the prettiest thing in the whole game!
Sound Effects and Music
I added a new sound effect for gaining health, and then, being finished with everything else, I decided to start with the music.
And I despaired.
I. CAN. NOT. MAKE. MUSIC.
If it needs more than 16 tones in a row, if it needs several instruments or tracks, I am completely lost.
Luckily I remembered who helped my friend relsqui with their game Dragondell, which they also made in Pico-8! Some guy named Gruber.
Of course, I didn't have the time or funds to commission him, but as it turned out he had released some Pico-8 albums under a Creative Commons license!
So I picked three tracks from his album Pico-8 Tunes Vol. 1: Space, Ice & Village.
I copied them over to my cartridge (I had to read the manual to figure out how), and that was it.
I was done!
Results
You can play the game and look at screenshots of the finished game right here!
Conclusion
This was a wild ride. I slept too little, got stressed out, despaired and... made a game!
I am glad that this jam finally gave me the motivation to do so, and I am very glad it only lasted one weekend. Working like this for a longer time would probably destroy me.
But I had a lot of fun, and I am proud of what I made!
Get Polished Paddle
Polished Paddle
Status | Released |
Author | kindfulkirby |
Genre | Action |
Tags | PICO-8, Singleplayer |
Languages | English |
Leave a comment
Log in with itch.io to leave a comment.