Postmortem
This was my first game jam š And, the first game Iāve written since the 1980s. My interest in writing games has been rekindled as a result of participating in some coding challenges with friends.
Engine
I met Hein-Pieter v Braam (Godot Developer) at a hack fest I organised a couple of years ago, and ever since Iāve been meaning to learn Godot. Iām a Linux user/developer. Godot is well supported on Linux and I had already started learning Godot about 10 days prior to the jam.
Godot - What worked well?
Iāve loved using Godot. Thereās plenty of room for frustration to overflow into rage while learning something new under time pressure, but Iāve not experienced that. Godot has been a joy to use, the documentation is high quality and there is plenty of reference material, Q&As and tutorials to guide you. I am absolutely going to continue using Godot for future projects as it has plenty more capability for me to learn.
- The IDE - Particularly the code editor.
- Exporting to HTML5 - Godot made it very easy for me to target the web
- AnimationPlayer - Zero code animations and effects.
- GDScript - Iāve done a fair amount of Python development and immediately felt comfortable with GDScript.
- Debugger - Syncing scene and script changes into a running game accelerated iterating and level design.
- Controller support - Adding wide compatibility for controllers was very low effort, and controllers work in the HTML5 export.
Godot - What would I do differently?
- TileMaps and TileSets - I am pretty sure Iām doing it wrong. I need to go and learn more on this topic.
- UI - I need learn how to UI with Godot. I kept hitting the limits of my understanding in this area, so my UI is very basic.
- Game timer - I used a
Timer()
for the game time limit, which was fiddly to pause when the game was paused. Next time Iād used the built-in framedelta
to craft my own level timer. - Godot asset library - Iād explore this more deeply to see what is already out there to save some time.
Genre
Advice in the Godot community often recommends that platformers are a good first game to make when learning Godot. I like platformers.
Platformer - What worked well?
- Safe choice - Lots of examples to work from.
- Tight controls - Adding jump buffering, coyote time and other player bias was fun and an opportunity to learn more about Godot physics, features and GDScript.
- Players and Enemies are very similar - Lots of code/scene reuse meant less work.
Platformer - What would I do differently?
- Hazard collision detection - Found a great solution for the player colliding with tiles that are hazards by putting them in a group called ādangerā. Could not get the enemies (derived from the same base class) to detect hazards in the same way. See my earlier point about TileMaps/TileSets.
- Clamping the player - Iād put the player in a bounding area early in the game design. I didnāt, so ended up having to create completely enclosed (inescapable) levels.
Graphics
The jam theme was āFreeā and I decided to use only free software and assets to make the game fit that theme.
Graphics - What worked well?
- Classic Hero - The small 16x16 characters had loads of poses and actions, which directly inspired game mechanics, such as:
- Shock/Stunned inspired the Mario-esque enemy stomping
- Parachuting to enter the game
- Flying Kick to dash and attack
- Animated sprites - Very easy to work with using Godot and adds some polish.
- Pixel-art - Choosing pixel-art made it easier to find assets that fit well together and rescaling them to match was easy.
- Juice - Adding lerped camera tracking, camera shake and sprite echoes when dashing was some nice visual polish and a great way to learn more about Godot.
Graphics - What would I do differently?
- Itch.io Game Assets - OGA was great for finding CC0 assets but has a limited selection. Iād absolutely start my asset hunt on Itch in the future, which has a vast array of options.
- Assets first - Do asset discovery and decide what graphics Iām going to use before the jam starts, as this helps inform game scope and mechanics.
- Moar juice - Learn particles and shaders to add visual impact and polish.
Audio
I am a lapsed musician. I rarely make music now and certainly wouldnāt have time to make music and sound effects during a jam. As with the graphics, I found all my audio assets on OGA.
Audio - What worked well?
- AudioStreamPlayer - Is easy for basic playback of music and sounds.
- Co-routines - A common pattern in Godot is to create an adhoc timer co-routine to ensure playback finishes before moving to the next instruction in a method. I used this a lot, not just for audio.
Audio - What would I do differently?
- Music autoload - Create an autoload/singleton for music playback so I can cross-fade between scenes etc.
- Sound effects autoload - Maybe create an autoload/singleton for all game sound effects to make it easier to trigger sounds from different scenes. I have some āplayerā sounds in the Item scenes for example, which got a bit fiddly to work with.
The Jam
On the whole, I am very happy with how the jam went. I made a mini-game, Itch.io page and learned loads about Godot in the process. I managed to (mostly) resist the urge to try and cram in unnecessary features and submitted the game a day ahead of the deadline. I got a decent amount of feedback and have some ideas about what Iād do to improve as a result.
The Jam - What worked well?
- Long time frame - 2 weeks isnāt loads, but choosing a jam with a decent time allocation made this fun and not stressful. I donāt ever see myself entering short jams in the future and will stick to longer running events.
- Pre-existing assets - I am not an artist and donāt have the time available to make music. Using pre-existing assets was a massive time saver and meant I could focus on the game itself.
- Daily Devlog - Writing a daily devlog, no matter how short, helped keep me focused on making some daily progress.
- Community interaction - Using Discord and forums to post updates and request feedback.
- Paused all other hobbies - I paused all my interests and hobbies for the duration of the jam. If I had spare time outside of work and family, I was working on Little Spy. Even when I was cooking, I was watching videos about Godot or game design.
- HTML5 - Going into the jam, I had no interest in making an HTML5 version of the game. But, the Itch stats show this is the most popular version, and Iām guessing, why I got a decent amount of feedback. Iāll be making sure HTML5 is a target for future projects since itās remarkably low effort.
- Postmortem - Writing this postmortem has been a very helpful retrospective and Iāve identified actionable things Iād do differently next time to improve.
The Jam - What would I do differently?
- Plan a jam - Iād look at the jam calendar to find an upcoming jam and start planning/scoping a game before the jam starts.
- State machine - Iād use a state machine next time. Little Spy is a simple game but the compound conditionals scattered about the place is borderline unmaintainable spaghetti code. If I come back to the project months from now, I think Iāll have a hard time following some of the logic.
- Streaming - I already live stream, but in the future, Iād stream more of the game development to get feedback and ideas early.
- Playtesting - I was too cautious about sharing a rough/early version of the game with friends for playtest feedback. Iād do this much earlier so I can make improvements and adjustments sooner. I had a late Friday night completely re-implementing the playerās movement mechanics 2 days before the deadline.
- Game Page - Make a game page, including art and basic pitch/instructions very early.
- Level design - Make smaller levels, but more of them. I started by making two large levels, one took most of a Saturday and the other didnāt make the final game.
- Judgement - I might be interested in participating in a jam where submissions are scored/judged. The reciprocal feedback of My First Game Jam is nice, but often not objective. If I want to improve, I might need a cold dose of objective critique ;-)
Will add post-jam
Now I have a āgameā, there are a few things Iād like to add in order to learn more about Godot.
- Toggle Music - Got to the point I just wanted to have Spotify playing while testing.
- Save/restore options - Save state for resolution/fullscreen and music on/off so I can learn how store user data in Godot
- [DONE] Android build - To learn the process
- [DONE] On-screen controls -
- [DONE] Android
- [DONE] HTML5.
- [DONE] Snap - Snapcraft is the app store for Linux - Not many games there.
Might add post-jam
- Player physics - Currently good, but not great. Iād like to have a nice reference implementation for future projects.
- [DONE] Improve collision detection - Make left/right player hitboxes so collisions are fairer.
- Windows UWP build - Just to learn the process.
- [DONE] macOS build - Just to learn the process.
What didnāt make the cut
Hereās what I had on my TODO list for Little Spy that didnāt get included.
- Player:
- Swimming
- Punching
- Ducking
- Enemies:
- Armed Soldier who fires bullets at the player
- Ninja and Samurai enemies
- Simple enemy AI to chase the player
- Health bar on enemies to show how many hits remain to kill them
- Donāt let enemies get stuck on small islands endlessly looping
- Gun turrets
- Platforms:
- Moving platforms
- Trampoline/springs
- One-way platforms
- Game UI
- Animate power-ups as they are collected
- Health, items collected and timer animations in the game HUD
- Credits screen
- Levels
- More of them with a more āpuzzleā style