GameOff 2021 - The Buggers
Copyright 2021 Brian Davis - CC-BY-NC-SA
https://github.com/intrepidhero-coder/gameoff2021
https://intrepidhero.itch.io/buggers
Intro
During 2021 I've been playing a lot with Godot. After participating in a short game jam on itch.io that had us all learning Godot I created 5 little demos in just a couple days. For GameOff I wanted to take those skills further. I've always been enamoured with 2D top down space games. There was a shareware game in the 90s (not sure of the name now) that was top down space action, but also had story driven RPG elements that was great fun. Also there was a furious multiplayer arena battle game that took over the college computer lab. Good times. I've written simple versions of these games a few times so the math and physics were very familiar. I wanted to see if I could add story elements while translating into my new engine of choice.
Godot - What's Great
I'm shocked how productive I am in Godot with such a short ramp up. It seems like every time I have a question, "How do I X?" online tutorials and documentation are plentiful and the engine has a thoughtful answer to the question. I haven't run into any show stoppers and the UI for building games is pleasantly snappy and helpful. I don't often use an IDE these days but Godot's provides helpful hints to get you started and then gets out of the way when you need to produce code.
My number one requirement for a jam is deployement has got to be easy. If it's much harder to run the game than "click to play" people just won't play and I'll get no feedback. Part of the appeal of game jams for me is making something that people find fun. And I don't want to spend precious time during a jam figuring out deployement. Godot can deploy to an HTML5 canvas that integrates nicely with itch.io. It works so well that I haven't really messed with the other deployment options. 👍👍
I can't speak to Godot's 3D engine but it's 2D is quite nice. Everything I've wanted, there's been a Node for it. When I want to add custom behavior it's been pretty easy. GDScript is very easy to pick up for casual use. Defaults tend to be sane and stuff just works. If I had to sum it up in one sentence it would be, "Way less frustrating than I expected." Guess I'm getting cynical. ;-)
Godot - What's not so Great
The main abstractions in Godot are Nodes and Scenes. It's really not obvious how to use these to organize anything larger than a trivial project. The documentation provides hints, but no real direction and online tutorials are all over the map. Most seemed to recommend breaking up your games in Scenes based on the screens and objects you present to the player and then exporting "packed scenes" and importing them into a main one. That felt weird to me and seemed to break the use of the Godot UI to navigate scenes, requiring code in a place that didn't seem right. I wound up "instancing" my child scenes in my main scene's tree, mostly as "placeholders". That makes them available to GDScript in the main scene to create objects from those scenes (ie mobs) or show/hide them in the case of single instance scenes like menus or the player node. I liked my solution ok, but it wouldn't scale much more than this. I'm not sure how I grow this game at this point.
Technical Debt
Writing during a jam is all about tradeoffs for time constraints and one way that often shows up for me is highly interconnected objects. I know as I'm writing them I should have better defined interfaces and less dependence on global state. But those are shortcuts taken as the deadline looms. If I wanted to grow this game I would need to resolve the issues with those interdependencies before being crush beneath the weight of unforeseen complications.
I can also sense that I don't understand what Godot is doing behind the scenes (see what I did there?). There's some amount of multithreading going on I think but it's all presented as event driven. When I tested in the HTML5 canvas for the first time I discovered a weird bug that sure looked like it was threading related: two things were happening in a specific order on my local machine but a different order in the canvas. This is an area that I clearly would need to learn more about.
Art and Sound
I'm definitely not an artist but have occasion to use inkscape in my line of work. For GameOff it seemed like a good idea to try using it to create my artwork. Godot has some support for SVGs, but at this point that appears to mean it simply imports and rasterizes them. It works just as well to apply any scale, rotation, or transforms in Inkscape and then export rasters to Godot.
I discovered that mucking about with paths in Inkscape allowed me a lot of freedom to create the lines I wanted through trial and error, something I have never been able to get my fingers to do with a pencil. Path editing in Inkscape is pretty nice, breaking, joining, splitting, adding handles, it was all pretty intuitive. I'd zoom in a mess with a path for a while, zoom out and check my work, zoom in and keep iterating. The UI in inkscape is replete with keyboard shortcuts too so learning a few of those made me quite productive.
I also discovered gradients, even pretty subtle ones, could give my art a bit of a 3D look that really took it up a notch from flat rectangles and lines. Again, the computer allowed me subtle control over shading, and infinite trial and error, that I've never had with paper and pencil. And yet the experience felt very much like drawing with paper pencil. The thought process was the same. Sketch these lines into a shape and color it in with shading. The results still look childish to me but considering what I've done in the past, I was quite pleased.
This was one of the few times I've ever played with sound in a game. I found a few samples online at https://freesound.org and messed with them in audacity. They're still pretty sparse but add a bit of depth.
Finally for the game page I wanted to put more effort into screenshots and videos. I installed OBS and recorded myself playing for a while. Then I loaded that video into OpenShot. Neither tool impressed me with the interface but they got the job done. After an afternoon of fiddling I had something I upload to youtube and run through ffmpeg to generate the gif above.
Conclusion
I learned a lot during this game jam and was really pleased with the results of my work. The game proofs out a number of concepts that I'd like to roll into a full production game someday. I learned a lot about the tools around game programming for art, sound, and video production. Game ratings don't come out until January and I don't expect to score very well given how little promotion I did. But I did play a good sampling of other people's games and feel I'm above the average in terms of making something complete and playable. But the most important thing is that I met my personal goals for the project.