Matt Tuttle

I Spent Ten Years Waiting for Godot

If you've been here before, you probably know me from Haxe and HaxePunk. Everything on this blog stops in 2016, and now I'm making games in Godot. It wasn't a straight switch, though. I technically went from Haxe to nothing. I tried Love2D, Bevy, and raylib, spent a few years writing an NES game in C, and poked at Godot on and off for years before it finally clicked in late 2024.

Why Haxe

First off, why Haxe and not AS3? It's strongly typed, it builds fast, and it works on a bunch of targets and platforms. I loved the type inference. You didn't have to write out the type, but it was strongly typed underneath. I liked the pattern matching, and enums that weren't just integers. Eventually I understood Haxe at a pretty fundamental level, and I even made a few contributions to the standard library.

So why leave?

Running an open source project

Running an open source community takes a toll on you. We weren't even that big of a community, but there were people who felt that I owed them something, even though the thing I was making was free. I can't imagine the weight of something as popular as Godot or Blender, although they have good teams behind them. HaxePunk did too: two amazing contributors and several others who kept the project moving forward.

The bigger problem was a choice I made early. I built the port on top of NME, which later became OpenFL, and that dependency ended up costing me. I found myself putting out fires more than adding features. Breaking changes showed up in minor releases, which wouldn't have been that terrible if Haxe had a better package manager. But haxelib didn't have version locking like npm and lix didn't exist yet. New users would download HaxePunk for the first time and ask why it didn't work, and the answer was that something had broken underneath us. OpenFL wasn't a bad project. It was focused on its own goals, but that made it hard to build on top of.

OpenFL plus haxelib were the nail in the coffin. We talked about making a version of HaxePunk with no dependencies, and I even built one in my own repository. I ported all of my own games to it but never released it publicly.

The other side was Flash. Around 2012, the vast majority of Flash developers fled the platform. I remember because I'd started a new job in 2011, which was another reason my game dev slowed down. Those developers moved on to other things. Unity had been free since 2009, Torque went open source in 2012, and Unreal became free in 2015. There wasn't much reason left to use our little open source framework, so the developers left. HaxeFlixel might still be around, but it's not the same as it was 15 years ago.

The years in between

The problem was that I didn't think there was another language like Haxe. A lot of languages were locked into a specific ecosystem, and I was on a Mac at the time, which sometimes limited what I could use.

I learned Lua, which has plenty of issues: arrays start at 1, there's no typing, and so on. I learned to like it anyway and wrote several things in Codea and Love2D. It had the same feel as Haxe. I could write code without any hidden layers slowing me down, and I understood what most of it did. Unity's ecosystem felt alien to me. I tried it, but it never caught on for me. I was also used to nearly instant builds with Haxe.

I had a bunch of starts and stops with Godot. I first played with it around 2019, but the first thing I built that was more than a really basic project was Napoleon in 2022, a Godot 3 version of SPI's war game Napoleon at Waterloo. It still never really clicked. I'd written a ton of Python for work, and GDScript felt "off." There were no list comprehensions (honestly not that big of a deal), there was no typing at the time, and it felt sluggish. C# support was either nonexistent or lackluster back then.

Then I got focused on my NES game. Echoes of the Unread started back in 2016 as a Super Mario Bros. ROM hack, and from 2022 to early 2025 it took up a huge amount of my time. In a lot of ways it felt like Haxe again: my own tooling, my own engine, and I could compile the whole game from scratch in a few seconds.

Picking an engine

As Echoes was wrapping up, I really wanted to make more games, and I kept trying things in Love2D. But I kept writing boilerplate, the UI was cumbersome to create by hand, and not many games actually ship in Love2D. Balatro is the exception, not the rule. I knew I needed to bite the bullet and learn one of the big three: Unity, Unreal, or Godot.

Then Unity shot themselves in the foot by changing their license, so I decided to give Godot another real try. In early 2024 I ported Napoleon to Godot 4 and made a few small prototypes. My background in open source made Godot feel like a better bet too. If I didn't understand something in the docs, or something didn't work, I could just read or edit the source myself. And I was mostly making 2D games, where Godot is stellar, so why not.

When Godot clicked

What finally got me there was a Udemy course by Firebelly, in late 2024. I'd watched one of his videos and was impressed with how he thought through his projects. His code was well designed, not like most of the half-baked beginner tutorials on YouTube. So I bought his courses and started working through them.

That's when Godot finally clicked. I understood how nodes are supposed to work, with scripts gluing them together. And building UI in Godot was almost fun?! Seriously, I hate UI. I hated it in games, I hated it on the web, and at best I tolerate making it. Godot came along and made it far less painful.

Since then I've made Hanadoku, The Universe Is Collapsing, and Ten Thousand Floors in Godot and a bunch of other prototypes.

I don't know if I understand Godot all the way down the way I did Haxe, but I understand how the nodes work well enough to stitch together a proper game. Godot's way of developing has definitely clicked for me.

Posted in Game Development

Tags: Haxe, HaxePunk, Godot