Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines
(10 edits)

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 frame delta 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