Select Page

My First Game Jam 2020

Welcome to this post-mortem article on my first complete game submitted to My First Game Jam 2020. This was such an amazing experience, I want to share as much as I can.

It’s good to be back! I feel bad for dropping the ball on weekly posts… especially after doing it for an entire year! Anyway, got some new stuff I’d like to document! So here we go:

For those of you who have been following along with my posts so far, you’ll remember I was working on a project called The Museum. That sort of… fell by the wayside. But! That project was started in Godot game engine, and that was the engine I chose to participate in My First Game Jam 2020. Coincidentally, that’s the actual name of the jam, and it was also my first game jam as well! The theme for the jam was: “Change”.

Day 1: What’s this game gonna be about?

I took the first few days just concepting a few ideas. There were lots of directions to take the broad theme. Eventually, I landed on a concept. You insert a bill into a shady-looking change machine. Then you spend the rest of the game banging on the machine, trying to get your money back.

Day 3: First Problem

Okay, I got a few assets done, got some of the basic code going, and pretty soon I ran into my first problem. Once I got a bunch of coins bouncing all over the place… how do I keep them all on screen?! Most standard platformer tutorials would just have you parent the camera to the player, and that’s it. But in my case, I had quite a few players that I wanted to follow.

So I ended up parenting all the coins in the game to a single node. Selecting that node, and looping through all its children to add them to an array called allCoins. Once I’d populated the allCoins array, I tried a few different methods to average the position of all the coins.

The idea was: Take the position data (Vector2) of every coin in allCoins, add them together to get for a sum total Vector2, then, divide by the total number of coins in allCoins. It made sense in my head, but it took a few days to figure out how to implement that in GDScript. Eventually, I got it working!

Day 4: New day, new problems

Now that I’d solved the camera tracking issue, there was a new problem. Once once coin fell through the gaps in the platforms, it just fell… and fell and fell. This caused the camera’s position (based on the average of all coin positions) to drop way down and just show the midpoint between the fallen coin and everything else.

Next, I set up some nodes that emitted a signal anytime a RigidBody2D came into contact with it. Once that signal fired, I had to not only remove the coin from the scene, but also remove it from the allCoins array. Those were two different things!

Halfway there!

Earliest recorded testing gameplay

Now it’s starting to feel like a game! I had a bunch of coins flying everywhere and, well… that was pretty much it. Feeling kinda good…ish

Closing in…

After a few more days of play-testing and letting a few friends and coworkers play around with it and share their ideas, I was getting my first ever feedback on a brand new endeavor! It felt amazing. This entire process really helped me mental health-wise in the middle of a full time job.

I didn’t like the first background artwork bits, and I wanted a little bit of parallax, but I knew I couldn’t have that much, being inside a machine and all… Eventually, I got rid of all the blue slotted background slides, and just went with a blue and grey hand-painted texture created in GIMP.

Game progress about 4 days after the first video was recorded

Last Minute Changes…

Up until the last minute, I was going with a sort of “compound interest” logic where for every coin you drop into the coin tray, the level reset and that number of coins was added to your total. So you’d start with 2 coins, and in about 2 minutes, you’d have over 100 coins flying all over the place. It made for great fun, but there was no real challenge for the player.

So in a last minute logic-change, I commented out the code that dynamically spawned new coins into the scene and went with a fixed number of coins per level. So now it was way more critical to get every. single. coin…

Increasing Difficulty….

This increased the game’s difficulty considerable, but I was still able to beat the game in wildly varying amounts of time from 5 minutes to upwards of 3 hours. But I was reacting a lot more to my own game now! It was very satisfying.

Personally, my weakest point is coding. I am still learning and getting used to the scene hierarchy and what I can and can’t do with Godot, and as a result… I feel like I spent a lot of time thinking about the game’s logic, and not as much time thinking about the game’s sound or music (there is no music) or artwork (none of it matches lol)

First comments and feedback

One of the first comments I got on the game after submitting to My First Game Jam 2020 was that I was taking all the control from the players hands and relying almost exclusively on physics and pseudo luck. Makes total sense, and I even had another friend suggest giving the player more than one button.

Overall, I leared a TON of new coding tricks, a lot of what Godot is capable of, and even more of what I’m capable of, developing games on open source everything. Thanks for reading! My First Game Jam 2020 was a blast, and I’m definitely looking forward to creating more fun games like this one. If you wanna see what the final result was, feel free to check it out:

Check out the GitHub repo: https://github.com/mjones129/keepTheChange

Check out more articles

How to Generate a Ranger Config File

ranger --copy-config=all This will copy all the default config files from /usr/local/lib so you can make edits without messing anything up. Huge shout out to https://dquinton.github.io/debian-install/config/ranger.html for explaining this and so much more. Took me a...

First Open Source Contribution

Surprise! I genuinely did not plan on making my first ever open source contribution today. In fact, I didn't plan on a lot of things happening this week at all. I recently got an awesome opportunity to work on a site that is being hosted on a platform called Pantheon,...

How to Exclude Specific Posts and Pages from WP_QUERY

For the sake of having something to work with, let's suppose we've got the following query:In this query, inside the $args array, there's a special parameter that allows you to exclude specific posts and pages from the query. This parameter is called post__not_in and...

Configure SSH For Password-less Connections

Preamble I'm slightly embarrassed to admit this, but it was a long time before I figured out how amazing this little file is and how exactly to put it to good use. The file I'm talking about is the SSH config file. By default, when you first connect to a server via...

WordPress Site Stuck in Maintenance Mode

Plugin Error Code 500 During Update While I was updating a WordPress plugin locally, something happened on my local server to trigger a 500 error code as the plugin was updating. On the frontend, I refreshed the page and was greeted with "Briefly Unavailable for...

Creating a WordPress Plugin Downloader

How it Started I was recently tasked with the challenge of creating a WordPress theme generator. The idea being, instead of writing your style.css file from scratch, you'd be able to just answer a few simple questions about how you'd like your theme set up, and those...

Fix Audio on XFCE Chromebook

The Problem After moving from GalliumOS to Xubuntu, I noticed that playing YouTube videos on both Firefox and Chromium would result in decent playback for a few minutes, but suddenly the audio would turn into a solid beeping tone while the YouTube video displayed the...

Adjust Trackpad Sensitivity XFCE

xinput set-prop "Elan Touchpad" "Synaptics Finger" 1 1 1 What are the values 1 1 1? This sets the sensitivity as close to the original ChromeOS as possible. Larger numbers will decrease sensitivity of various aspects. I never looked into which individual value...

Fireworks (Short Film)

https://vimeo.com/395077249 About the film Year: 2020 Director/DP: Tim Searfoss Writers: Matt Jones, Tim Searfoss Sound Mix: Matt Jones

Hosting Multiple Sites Using LocalWP

I've done a write-up on hosting local WordPress sites before, but I definitely prefer this method over the previous one. If you've never tried hosting multiple sites using LocalWP, then I'd encourage you to check it out. I've had really bad issues with it in the past,...