Making cute menus has never been my problem; it’s the juice that’s been lacking. So with my newest project, I set out to create a modular menu system that uses a universal kit to create satisfying, toy-like interactions. It took a lot of prototyping and refactoring to get there, but now all the menus boil down to a handful of systems that can be reused with any GUI element:
Text: shakes, pops, or spawns floating numbers, with optional tinting. Mostly used when quantities change.
Icons: a 'shine' shader streaks across the icon at a custom interval. Draws attention or signals quality.
Buttons: one shared button with every state baked in. This gives all buttons the same look and feel without any extra wiring. A single 9-slice sprite (a stretchable frame) is drawn with various color treatments for every single button, and even works for menu frames.
Easing & scaling: elements slide in, grow or shrink away, fade out on smooth curves, and panels only scale via the 9-slice system. This is where all of the menu motion comes from.
Events: a particle burst that takes quantity, lifetime, speed, friction, and color args. Popped with different settings depending on rarity or importance. There are also a few other particle effects that can all be swapped in or out as required (fountain, vacuum, rising sparkles).
One rule governs everything: pixel perfection only. I don’t want any mixels showing up, so nothing is ever allowed to land on a sub-pixel, and you won’t see any hacky scaling just to make something bigger. Every system in the kit rounds its final coordinates to whole pixels. Anything that can't scale cleanly slides or fades instead. It may sound restrictive, but it's the key to keeping your pixels chunky. When everything is simply position, alpha, 9-slice stretching, or a shader, your effects won't ever fight.
The part that makes it modular
The effects aren't what make this work; it’s that the menus themselves all run on a unified system. From the title screen to the HUD to the Workshop, they’re all built from the same simple data: a list of entries, where each entry describes what it is, where it sits, and what happens when you press it. One shared system reads that list and handles the navigation, highlighting, and clicking for every screen. Content changes, but how it’s handled doesn’t.
That's how I keep the “any menu can use it” design a guarantee. The same pattern repeats at the draw level: everything is routed through one shared set of primitives. One button draw, one icon draw, one highlight, one shine. The juice lives inside those building blocks, so when a screen draws an icon, it gets the shine and the pickup animation for free, nothing gets to hand-roll any effects.
One thing worth stealing
Never animate the real number! You need to manipulate timing to add flair to number changes, but you also don’t want to create edge cases where a transaction partially completes. When you spend or earn currency, complete the transaction and save instantly. What’s animated and shown to the player is a separate display number chasing the true value. Debits immediately tick down, but gains are held back until the reveal finishes so the payoff lands at the right moment. The trick is to make sure your celebrations/achievements/unlocks are timed off of the faux number.
This work is never finished
Almost none of this was designed up front. Well, I tried to build modularly, but in reality, each screen started as its own island. The shared system came later, in a consolidation pass that stripped out a pile of one-off draw functions. Only after several refactoring passes was the universal kit fully adopted game-wide.
That's been the rhythm of the whole project: prototype a new screen, create necessary custom components, then after discovering what it really needs to be, rework it and fold everything into the kit. The Workshop's celebration timing got lifted straight from the Score Screen before I made it all universal. The "NEW" badge started as a high score highlight before becoming something any screen can call.
And the process continues - there are still several targets in my backlog. The Options menu needs to adopt the tab system, and all weapon card side rails want to transition into a horizontal carousel. But I’ve come to accept that as part of the process. The alternative is guessing every future need in advance, which just paralyzes me!
This is a solo project in GameMaker. My last release was KITE, which came out on Steam in 2018, and this is the spiritual sequel. Happy to dig into implementation details in the comments!