Practical Juicing for Game Devs
If you’ve managed to find this article, chances are you’ve heard of game juice (or game feel). I personally think of game juice as the subtle feedback refinements that increase responsiveness and overall satisfaction in games. It could be the slight bounce of a brick block as Mario jumps into it, or the flashing light of rows as they’re cleared in Tetris.
Depending on the game and genre, juice can manifest itself in many different ways, but juice is generally used to improve a game’s immersion and moment-to-moment appeal. It also gives your game tons of personality!
From my experience, many hobbyist game makers tend to be programmers that drive their games through functionality: the ability to jump at all is prioritised over how the player jumps, and how cool they feel when they do it. There’s a massive opportunity for game makers to also learn how to improve their game’s experience.
There’s no one right way to juice a game, and mastering juice is usually done through practice. I just wanted to share some really practical and effective decisions I’ve made for a game I’m working on. These tips are all related to visual tuning. They’re not meant to blow you away, but they should encourage you to consider how easy and useful a little bit of juicing can be!
I want to design an enemy for my 2D platformer. It moves exactly like a Green Koopa from Super Mario Bros. It moves along the X axis until it collides with an obstacle, and then reverses direction. It repeats this process forever, and if it touches the player, it kills them.
I first program the enemy exactly to the specifications. This is where a lot of programmers finish this task, but it’s sometimes good practice to stop and think about what can be improved.
Since the critter moves relatively fast, reversing direction is very abrupt. Also, its movement seems really fixed and robotic for something that’s presumably alive.
Acceleration is introduced to its movement logic. Our critter will ramp up to a fixed maximum velocity, and reset its speed to zero after colliding. Since its velocity is no longer constant, the movement pattern is slightly different than before, but this will be fine for all practical purposes.
Note: the animation playback speed is proportional to its velocity.
This is better, but there is still plenty of room to improve. Pay attention to the moment it collides with the blocks. Does it feel natural?
The enemy is given a very slight upward push when it collides with a block. This provides the feeling of momentum: all the energy built up while running is transferred somewhere.
We can extend the idea of momentum to other objects in our game — including the camera itself. Vibrations in the air can cause our imperfect camera to wobble.
There are many, many different implementations of camera shake that have different advantages. My generalised camera shake logic is:
- store a 2D vector to offset all drawing coordinates, defaults to (0, 0)
- for a right-ward camera nudge, set the offset vector to something like (+10, 0). Higher nudge strength means greater vector magnitude
- over a short time period, interpolate the offset vector value back to (0, 0) using an easing function like out-cubic or out-elastic
If none of these words make sense to you, I strongly suggest reading on tweening, linear interpolation, and easing functions. There’s a bit of math, but this really is the heart of motion game juice and will do wonders for you and your game!
It’s important to note that camera shakes can also add functional value to your game. It gives players a way to detect something that is outside of what is displayed on the screen.
There are many reasons particle effects are good to tuning the visual design of a game, but a compelling reason for this particular case is permanence. All of the previous tweaks really only affect the game’s experience over continuous time. If you were to take a screenshot of the game, the previous tweaks would have all looked identical. Adding particle effects provides expression that the player will notice even if they catch a short glimpse.
I added a dust particle effect that is emitted with a frequency proportional to the enemy’s speed. It provides a sense of motion even in still picture, and immediately describes where the enemy has moved from.
What do you think?
The difference may be subtle, but consider how much personality is given to enemy with just one walk animation and a simple movement path. Movement is just the beginning of juicing the enemy. There are plenty of other interactions: injuring the player, being squashed by blocks — all things that could use fine tuning. Habitually juicing game mechanics produces a dramatic difference in feedback interaction that separates good games from great ones.
When To Stop
I see a lot of radical attempts to enhance game feedback, including effects like chromatic aberration and lens flare. Sometimes it works, but sometimes it’s a gaudy mess.
The 5 trials I mentioned were certainly not the only 5 I tried. Different particle effects were tested, as well as many movement parameters. I usually stop juicing once I feel like an interaction communicates just enough information and also conforms to the rest of the game’s characteristics.
It’s easy to go overboard with effects, but just remember the words of Antoine de Saint Exupéry:
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.