/blocks

2.5 Weeks of Game Maker and Tetris


Retrospective of the 2-week development of game jam entry , and how I was learning Game Maker while making it.

Overview

I've been learning Game Maker to see if it's the 2D game engine for me. Having only used Unreal Engine, I needed something suitable for making smaller 2D games, faster. My goal was to learn the engine enough to make a Tetris clone for the
Falling Block Jam 2025

See all the entries for that jam
. Hopefully, I'll know if this is the engine for me afterwards. And I do know, now. It's definitely not for me and is getting frame 1 uninstalled.
It's probably important to note that I'm not a programmer, and I'm also using a Macbook (until I exported using a PC). I'm also crash coursing this in under 2 weeks with the knowledge of someone that new to the software.
Pros
  • Straight-forward coding syntax
    The language becomes something easy to guess. Stuff like "Draw_text" to create some text on the screen, or "draw_set_color" to set the color of text.
  • Good documentation
  • Good official beginner tutorials
  • In-engine sprite maker
  • Bundled VFX for prototyping
    You can create simple effects with a single line of code. Great for prototyping different states/stats without mcuh work.
  • Basic events all set up
    Events like "Create", "Destroyed", "Clean Up", and "Draw GUI" make for a good starting point in organizing events on an object.
  • Persistence and collisions are simple
Cons
  • Messy and crowded interface
  • Frustrating laptop navigation
    There's a button to turn off Laptop navigation, but it's still not enough. You'll find yourself scrolling and not moving cause you're in a code box. The mix of a free workspace with node-like interfaces and the coding space itself is frustrating.
  • Art & animation tools are primitive
    These tools are probably good for most cases, and definitely for beginners. But, as someone who thrives in art and animation software, they are too incompetent and don't meet expectations.
  • Requires Opera account to export
  • Can't create custom events
  • Layer order gets confusing
    VFX would sometimes draw above or below sprites, ignoring the _above or _below commands I gave it. It took a while to figure out how Draw and Draw GUI differed. Overall, the layer order felt difficult to manage or debug.
  • QOL features just not great
    For example, creating children of objects requires manually selecting the parent, rather than right click -> Create Child.

Lessons for the newbies

Through this devlog, I link to any tutorial I used along the way. My main resource was the official Game Maker Manual. Some early advice though:






Day by Day...


Day 1 (Sep 5): Asteroids

I started with the
official beginner tutorial

From the GameMaker Youtube channel
. The bundled template project and side-by-side of GML Visual and Code makes for an impressive starting point to a first project. Although, the tutorials often told you what to do and not any coding philosophy behind why. I had many questions, but concluded that it's done this way because Game Maker has a lot of guardrails set up for simple games. Why do we only get 11 Alarms? Why can't I trigger them on the same frame it's called (it always needs 1 frame)? Why check for buttons on Step instead of on Key Press?

Despite what it may seem, this was absolutely my intention.

Day 2–4: Improvising Tetris

I spent days trying to make Tetris the way I would assume—by creating a 10x16 grid to which each unit could be occupied or empty. I would use coordinates to check rows for clears and guide blocks. Some Googling led me to
ds_grids
Official GameMaker documentation on ds_grids
which I assumed would be perfect. I ran into a wall quick, when my lack of Game Maker knowledge caught up. I was able to spawn, drop, and destroy a block and spit out the coordinates on the grid, but I couldn't figure out how to generate the tetromino shapes, let alone have them rotate correctly without going down a rabbit hole.

Day 5: Tetris

I crumbled and followed a
written guide on making Tetris with GML Visual

A very detailed step-by-step from Yellow After Life
, but in GML Code. I took some liberties with the logic and set up variables knowing I'd need to build on them later. Although I didn't like this hard-coded method of making Tetris (not adhering to a grid but manually displacing 32 pixels), it was working and I had less than two weeks to hit the deadline.
This taught me how small and single-service an Object had the potential to be. Alarms were now my go-to method of activating behaviour. I would've preferred to have created functions owned by the objects. The tutorial also suggested making sprites in-engine which kept my workflow momentum high without shooting me off to Photoshop or Procreate.

Day 6–8: My Tetris

The customer system was built off of what I had learned from setting up tetris, along with lots of Googling. The customers would spawn randomly in the same method that spawned different tetrominos. The customers would increase anger on a timer, similar to tetrominos dropping on a timer. Any time any lines were cleared, the quest manager would check for all spawned customers for matches, remove them from the quest array, and add to the score. The customer queue would shift over using the same logic that moved tetris blocks down after a line clear (by spawning a collision box and moving everything it collides with over a unit). Visually, I leveraged the built-in VFX instead of creating new sprites every state, and I randomized the block that would be created to give a visual distinction to each unit on the grid.

Day 11: Better Tetris & Game Loop

I added the game loop around the Tetris. A game cycle manager (built off of an
in-game clock
Code straight from the forums. Modulo is great.
) would send you into another room at the end of the day. It would also queue a game manager to cache your score for persistence - which - was surprisingly easy to set up with a click of a button. This room-by-room travel with a persistence boole told me Game Maker was really built for 2D RPGs and platformers.
I also introduced
dialogue
From official GameMaker channel
via tutorial which taught me about Scripts. I wish I knew this earlier because it's exactly what I've wanted out of Alarms. I altered the tutorial to allow for creating an instance Object at the end of a dialogue tree, allowing me to daisy chain dialogue and events together (dialogue → score report → dialogue → start next day).
I also learned about
sequences
From GameMakerStation - Mathroo
. I love setting keyframes and tweaking curves, but Game Maker's sequencer tool doesn't make it easy (you must "convert" between keyframes or curves, and it deletes your curves in that conversion). The sequencer is best if relying on pre-set curves, and authoring simple movement. It's limited in its offers (no alpha control) and QOL (can't split X and Y apart in transform/scale). Its Moments system looked powerful, although I didn't use it. A too primitive sequencer tool is what turned me off of this engine, since scripted animations and motion graphics were in my wheelhouse. I struggled with triggering animations on existing objects (i.e. play an animation on THIS thing on the screen). So, if I wanted The Boss to exit the scene, it would first be destroyed and replaced with a sequence of his sprite exiting.

Day 12: Art Pass

More layers were added to organize what moved with what didn't. I tied some more objects to events (i.e. the sign would flip when the store opened). I also widened the play space to accomodate for the larger customer sprites. I opted to keep the tetrominos within engine, and use the Sprite Maker tool to create simple animations and colour adjustments. The feature became more frustrating the more I had to use it. Game Maker's colour picker is still from 2006, unable to store colour palettes across multiple launches of the engine, let alone even between editing different sprites. Tools like flipping the canvas are hidden under toolbar menus, and its shortcuts were unlike any other software I've used (Brush was not B, but was... D?!). Even the grid snapping and brush size couldn't keep its settings, making consistency frustrating to maintain.

Day 13–14: Polish & Sound

I added a
screenshake FX layer

Simple tutorial on setting this up and enabling it via Code
and a script that set it to visible for x amount of frames. This let me call ScreenShake() anywhere. There were definitely more complex approaches, but this was good enough. It would also set off some prop animations: the held tetromino and bell would hop, and the sign would swing. These were done via
lerp (linear interpolation) logic
"What is Lerp" tutorial from GameMakerStation - Matharoo
in code.
I also created a
background tint script (layer_background_blend)
Link to the Game Maker Manual on setting background blends. I copied the code straight from this page.
that let me color the scene when the store opened, closed, or when the game was over.
I recorded some audio of slapping raw sausage on the counter and chopping some tomatoes, and ran them through FL Studio's many sound effects to crush them into farty noises. Attaching them to actions was very simple and I scattered them everywhere.

Day 15: Music & Tutorials

I copied the MIDI pattern of the tetris theme into FL Studio and futzed around to create something dirty sounding (albeit, bassier than I expected because Macbook speakers have no bass). The Game Maker Audio Mixer did not allow for increasing the volume of individual sounds, only for decreasing volume. Once the music went in, I re-exported every SFX louder to mix within Game Maker. I would play/stop bgm everywhere, leaving that code scattered across objects and rooms. If I were to do this again, I'd create a music manager that would remain persistent and controled the music. I combined the Pause and Dialogue features to create a tutorial moment the first time you receive garbage.

The built-in vfx had strange layering priority and would eventually be removed for that reason.

Day 16: Balance, & Polish

Sep 20. I learned about UI layers. Just enough to for a pause menu and titles that will have their visibility toggled when appropriate. Game Maker's UI follows expected web dev setup which is great. The fact that UI is a persistent on top of all your rooms seems great for HUD and control. In terms of balance, I tried to make the first level easy -- I thought too easy. But after two friends play were not able to finish Day 1 after half an hour, I needed to reduce difficulty further. I learned that players who don't play tetris will panic mash in tetris, which caused bugs I've never run into. In response, I created a difficulty manager that would let me adjust variables across the game depending on the amount of runs cleared. I also added weighting to the customer objectives since getting four "4" customers felt rough. I also simplified the scoring system to be easier to balance. Along with bug fixes, I consolidated repetitive code into scripts to stomp out potential bugs I didn't find yet.

Day 17: Bug fixing & Submitting

Sep 21. The option to create an executable isn't available if you are not logged into Opera and have that linked with Game Maker. I also learned you can't export for Windows on Mac, and to export for Mac at all, you NEED a paid Apple Developer ID. Exporting for HTML5 bricked my game at the title screen, so I would need some heavy debugging to get it working for the in-browser on itch.io which I would definitely not do. Luckily, you can bring all the working files to a PC and export from there. I exported, uploaded, and thus concluded my journey with this engine. Onto Godot next!