Wave

My Time with GameMaker 2

Mia Rose Winter

Now, since I worked with GameMaker 2 on a proper project, for four months, I want to put down some of my thoughts about it. I have dabbled with it in the past a bit but nothing major, so going into it with two other people and the target of developing a game in a semester at uni was quite the jump, but that's kinda how I roll best.

The Project I worked on

For our Project we wanted to make a small, turn-based strategy game. We already had the game concept worked out, so it really was mostly about game design and implementation, which made a lot of it easier. In the beginning I worked out the MVP with the others, laid out a project timeline, assigned task, and from there on managed it when I didn't code myself.
Getting into it was a bit of a hassle in the beginning, Game Maker Language really was not intuitive to me, the way it kinda does a bit of jsdoc, and the difference between functions and methods was really confusing, and left quite some code smell. After some task were done and some stuff got refactored, things started to work pretty fast and we got basics of the game going after two months, when we had to do our first little showcase of it to our professor, and it looked quite okay, it worked. And while I find it impressive how fast we got things running with the tech, more and more annoyances added up, feather complained about wrong things or didn't detect stuff, merge requests always had really unnecessary conflicts, auto merges sometimes wrangled the project file… it needed quite a bit of housekeeping from my side.
After an additional two months and some very heavy crunch in the last couple of days, we got the game in a state that I would say is already very polished, if we were to add some more content like levels and items, it would easily be early access worthy, and already a lot of fun. We got quite a lot of feedback on the second, public presentation at our booth at the Unis day of open doors event, where all the projects get to show of their stuff, partly because of the brand recognition (we got to make a Winx Club fan game after all), but partly also because it was just good. Here and there are little UX things to improve but I must say, I am impressed how far we got in such a short amount of time.
We now have a little bit of time left to fix some bugs and finish the MVP before we hand it in and get our grade (plus the documentation I have to make 😭), but overall, I am very proud of the result, wish I could show it off here, but copyright…

What I like about GameMaker 2

Obviously, the selling point of being able to quickly make a 2D game stands, a couple scripts, some assets or not, and you got your game, and if you don't make something complicated like a turn-based strategy game, you will have quite the result after a minimum of time, depending on your skills and familiarity with GameMaker. The IDE seems to work nicely for many people, the tools for creating sprites in it and other things are useful at times, and the focus on 2D games just shows in the way many systems work, an experience you just don't get with an engine trying to lift a lot of genres. I can really see myself make more games in it… on my own…

Teamwork makes the project manager hurt

And there I also discovered an, in my opinion, big issue with it, working with multiple people can really become pain fast. The way the project file works, how merging rooms is tedious and the way the git integration is barely existent… you really don't have a great time the more you have to work together with other people, and as a project manager, I had to learn the ins and outs of the way projects work in order to fix a lot of stuff every merge request. After a while one has figured out how stuff holds together, and where git will struggle, and when you are very skilled with git, like me, you will resolve many issues pretty systematically, without much thought, but that you have to this is pain.

Feather

I really don't like that one. Instead of implementing a good system that allows you to properly hint how things are used, like with complete support of jsdoc, you have this weird… tool that tries to guess how things are supposed to work, based on how it's used I guess? It's supposed to discover fields and functions, it's supposed to find out what types values are, and what function they have, but it does none of that well. And the thing is, when it doesn't understand what types certain values are, it will bombard you with errors and warnings on everything interacting with it, making that little feather panel completely useless. It also “hints” at certain naming conventions, that are not configurable nor expandable, which annoyed me because I named all my gui components, since they render on a different surface and function very differently than anything else, gui_, and boy did feather yell at me for that one, I must have like a hundred hints just about that.
I just don't like how feather fails at guessing what your code does, and doesn't give you the option to tell it what it does, but then again, I never liked dynamic languages much to beginn with.

Lack of features

There are things missing in GameMaker, that really make me wonder, because often other Engines have them, and I consider them vital to pretty much every game. I am mainly talking about the weird depth system, the inability to easily render-order, and the absence of an input mapping system. Addressing the easy one first, why is there no input mapping? Other engines have them, and they are a vital and easy accessibility feature in anything having physical inputs, so the fact I would have to implement that myself is really weird to me.

The other, more complex but also baffling thing is, what GameMaker does in regard to depth rendering. Basically, you put instances on layers, layers have a depth value, stuff with a lower depth gets rendered first, with higher values later. The thing is, this way you can separate certain elements from each other, but certain functions rely on things being on the same layer? And you gonna have some things on one layer anyway? So what happens when they get to close to each other? Well, who got created first, renders first. Now you think, assigning some depth would be easy and fix that issue, even if a bit clunky, right? Well, GameMaker has an obsession with a depth being a layer, so apparently, when an instance gets assigned to a depth, it gets assigned to that depths layer, and if there is none, it even creates one.
I haven't tested it performance wise but for many reasons this is just horrible, first and foremost because it makes me feel bad.
So you wonder, depth ordering is something basically any game needs to do, especially 2D ones, so how did other people do it? Well, apparently, in the past, people literally make manager objects that take over rendering the instances on a layer and sorted them. Not only is that heavily CPU bound and horrible for performance, it's also feels insane? Like a hack you would come up with first time developing an engine because you don't know what a depth buffer is. Well, with GameMaker 2 we got support for shaders! Only fragment and geometry tho, since most platforms support that. So if you look up a sensible way to do depth ordering, you will find this one blog article of someone hijacking the alpha channel and z value to virtually put every sprite at an angle, so they can properly and sensibly overlap.. just don't have anything with an alpha value other than 1 or 0 I guess.
For my game, this all couldn't do, so I came up with a system myself. The game world and all the entities are on a grid, so every entity could be assigned an y value on that grid, now I made a shader that could take in that grid y and assign it to the z value in object space. This still required all the entities to throw some values towards the GPU every render cycle, but at least the math and sorting would be done by the GPU. Honestly, I figure, it would probably be more effective to do the sorting of instances thing, just because with the grid, the positions of them change rarely, and only one at a time… so doing that instead of z-testing and uniform throwing would probably more effective in our case, but I literally only had like five hours to figure this out.
I have an article on draft just about that depth rendering.
Which brings me back to my question… why is there no system for proper depth rendering? Or entity sorting? Or something else ?? I just don't get it.

Animation was also something we struggled with. My teammate implemented a whole animation-system- state-machine thing to do some simple animations of our characters shaking or moving towards others to signify attacks and damage, and it messed with quite a lot of systems so late in development, since it relied on that weird alarms system… I just can't imagine how people do animations there properly, apart from the classic cycling through images… I want my characters to express emotions not just by gifs, I want to be able to shake them and move them and squish and squash them! But one seems to first need to invent the universe to make an Omelett here as well.

Documentation and Resources

First of all, the official documentation of GameMaker 2 is often very lacking, the IDE-internal documentation hints are often barely explaining anything, and pressing F1 just opens the doku article of that method. Many many times I have found myself wondering how a function works, when it executes, especially the GPU ones, gone to the doku, and found no answers. Sometimes the simplest questions I had would not be addressed, and often the code examples gave me more hints at what stuff does than the explanation text, it's really not good. And the problem is, searching the web for answers also will yield barely any useful result. It seems the people that use GameMaker don't go on StackOverflow much or write many blogs, as mentioned earlier, that depth ordering thing had literally one single blog article. There is also a forum, but it barely contains anything useful, there is a subreddit, also barely anything. There are youtube channels which are like the best source for stuff, but sometimes even they don't provide good info since they worked with older versions of the engine, lacking features or sometimes doing things differently even. All in all a pretty frustrating experience where you find yourself reverse engineering the engine a lot to figure out how to do stuff, or looking up general purpose explanations of systems and algorithms, and then trying to figure out how to do that in this engine.

Of course, minimal use leads to minimal documentation and tutorial leads to minimal use… but that's why a proper, official documentation, and also a way to document code, is so important, and it's absence is so infuriating.

My Conclusion

All in all, I wanna say, don't use if for anything requiring a team. Developing something on your own, especially something not too complicated or smaller will probably be easiest with GameMaker, once you learned it's quirks and can somehow make a blood sacrifice to feather to be able to read your mind, you can achieve moderate things fast.
I wanna have a look at Godot next, because the things I have in mind are really not suitable for this engine.

About the Author

Mia Rose Winter

Software Developer / Project Manager. Full-time cat Woman and bisexual menace. Really not liking tech these days, I have more fun writing stories and books. Developer of GeeksList, Just Short It and Wave.

This might also interest you

Generation 3 of Pokémon is held together by duct tape and I can prove it

Forbidden Tempura 4/16/2024

The problem space Pokémon is a franchise that needs no introduction. Millions upon millions of people have had some exposure thereto. I would like to focus on one tiny implementation detail of the games that formed the third generation of Pokémon: Ruby, Sapphire, FireRed, LeafGreen, and Emerald. In this generation of the games, the developers of the series first started trying to discourage cheating. To understand what they did, I first need to introduce a few concepts. A Pokémon is an individual member of a Pokémon species. Think of it like a specific individual, just like how there is a sheep that you encounter and there is the species of sheep, of which the aforementioned individual of a member. Every Pokémon has a 32-bit personality value (also commonly called personality ID or PID for short). A (Pokémon) trainer is a concept in the games: Trainers go around and make their Pokémon fight against other Pokémon. They hold contests to find out who is the strongest trainer. Supposedly

Game DevelopmentGamesInfodump

My First Game In Godot

Mia Rose Winter 3/7/2024

Last Sunday I decided to finally take a shot at using Godot. I only looked a bit at the getting started section of the documentation but haven't looked at anything past that or even tried using it past myself, past downloading it. As I used many engines before, and tried to make my own, a lot of it was very familiar, but many things were also easier to do than in other engines I know. As I do, I noted in a group chat that I still don't know how to make the 404 page of Wave more interesting, when Nyx suggested “dino minigame but with shork”. As I was a bit kaputt that morning I thought “yea let's go” and opened up Godot. Well, first I needed my main character, so I crudely copied a blahaj design from a sticker Rain gave me a while ago. With that set, I opened up the editor and looked around YouTube and the Godot documentation for all the little pieces of Information I needed. This “Godot 4 Crash Course for Beginners” gave me a good start. In it the c

Game DevelopmentShowcase

Depth Ordering in GameMaker 2

Mia Rose Winter 2/29/2024

At some point during your usage of GameMaker 2 you will very likely encounter a very classical issue in game development, how do I ensure my sprites are drawn in the right order? Anything 2D with movement will still have a sense of hierarchy, some things are in front of others, but how do you do that with GameMaker? When you will look into your trusty search engine, you will most likely find either this blog about using a technique called z-tilting, and if the following doesn't satisfy you, definitely check it out, or you may find the YouTube channel FriendlyCosmonaut with this tutorial video, which is a bit older but still teaches some valid techniques. As someone with more background in different engines and other areas of software techniques, I want to elaborate on some of my strategies to solve this issue, including the one I used in my student project game fairy-strategy, a turn based 2D strategy game. The classic depth = -y The oldest and easiest way to get this working. Things l

Game DevelopmentTutorial
Powered by Wave