I've been playing around with Game Make Studio 2 (GMS2) while I attempt to write my game, and I've run into a few things that have frustrated me so far.
Disclaimer
- The target market for GMS2 seems to be people with little to no programming experience. I've been programming professionally for 15-20 years. My needs, and the way I think about development differ from people new to development.
- I've been working with GMS2 for about two weeks, it's likely there's things in here that I haven't found yet that could help on some of my issues.
Bugs
Inconsistent rendering when switching between monitors
When plugging and unplugging an external monitor I'll often end up with GMS2 rendering its screen either uncomfortably large, or uncomfortably small. Restart of app is required to fix.
Renaming a Room just deletes all that room's creation code
When you rename a room it the room creation code associated with it is deleted, the game then fires an auto-save to make sure it's really gone. Seriously.
Problems/Issues and Irksome Behaviour
The dev environment is a 2d plane you fly over
It's possible this makes sense for some game types (GMS2 supports "drag and drop development") but for a code heavy approach this has proven nothing but annoying.
There's no null
There is noone
however, which is actually -4
. Null comes in handy, I miss it.
When editing an object's "events" all of that object's properties are in scope
In PHP I'd refer to a variable's property with something like $this->direction
. This can seem annoying, having to type $thi
s all the time. But it's actually really handy: as your code evolves you may end up creating new properties that have the same name as some variable you used inside a method. This came up for me when I tried to store an object's direction of travel inside direction
. It turned out that direction
was actually a property that already meant something, and only allowed numeric values. GMS2 already supports with, which allows you to pull all of an object's properties into scope temporarily, I'd much rather be forced to use that than have it happen by default. The only way to avoid this being a problem is to either memorize all an object's properties, or note how the IDE colours variables to watch for problems.
This also seems wrought of peril if GMS2 does a release that adds new object properties. Upgrading could break scripts :(.
Sprites can have arbitrary origins
When adding a sprite to your game you may specify that sprite's origin. Which is the part of the sprite that will be drawn at the pixel indicated when placed. Top left and bottom left would be common choices. But you can pick literally anything, including spots outside the sprite, and it's super easy to do this. I accidentally placed the origin of my 64x64 "building" sprite at 26,73. I didn't notice while tiling them across a page since they worked well relative to each other, but it was kind of a weird problem to debug when I added a new object with a sensible origin.
Inconsistent String vs Constant handling
Here's a line of code from my project
instance_create_layer(intersectionX, intersectionY, "GUI", obj_crosshair);
In this code I'm creating an instance of obj_crosshair
and placing it on a layer named GUI
. I don't really understand why one of these is passed in as a string "GUI"
, and one of them is passed in to function as a constant obj_crosshair
.
array_length_1d
I mean, it's just such a weird function name. There's a twin for 2d. Also keep in mind:
WARNING!: If the array has over 32,000 entries this function will return an erroneous value and should not be used.
instance_create_depth range
Rather than place objects on layers you can define a depth, the lower the value the closer it is to the camera.
IMPORTANT! There is a minimum and maximum layer depth of -16000 to 16000. Anything placed on a layer outside that range will not be drawn although all events will still run as normal.
Apart from negative being closer to the camera being weird, this range of -16000 to 16000 just seems super weird to me.
Creating Functions
You don't actually get to make functions in GMS2, (no objects either, thanks for asking) you make scripts (which you navigate the 2d plane to find). Scripts sit rather beside your other code (they're created in the same way you would create a room) and purportedly this makes them easy to reuse between projects, but they end up feeling disjoint. I'd rather add a custom method to an Object, well, I can, but only 16 of them per object, and they can only invoked from within the object itself.
Conclusion
GMS2 has been a far more approachable way to write a game than Unity was, but as an experienced developer I've found some of their design decisions frustration. That said I'm not the target demo, so maybe that shouldn't surprise me. Anything they do to appease me (and people like me) could end up hurting their target demographic.
A Plea
Am I missing something? is there secret power behind these design decisions? Is there worse stuff hiding behind the next bend? Comment Below!