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!
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.
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