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.
