Guide on Jumping in platformers

Jumping is essential for platformers.

Balancing it might be difficult, but is crucial for level design of the whole game. Good news are that there are only few variables, you actually need to consider!

Here’s a handy guide on jumping: 🤸

What is jumping?

Jumping in platformers is a form of gameplay built on player’s skill.
Players learn how the controlled character behaves in air and must be able to predict the output of the actions taken. Pressing jump button the same way hundred times in exactly the same conditions should always give the same outcome.


You can actually describe every jump ever made by just a few variables:

:arrow_double_up: Maximum Height

Determines how high the character can get with a single jump action. After reaching this point, the character is descending down (or better said in the direction of gravity vector).

:arrow_up_small: Minimum Height

Determines the minimum possible height of the jump. The two parameters determine where player can or can’t get with jumping actions, influencing the whole level design.

Sometimes those values can be the same making one kind of jumps always, sometimes can differ. For tile based platformers those limits are many times multiples of character’s or tile height.

:no_entry_sign: Jump Cancelling

Describes whether you allow modifying the time when player actually ascends up. If Jump Cancelling is allowed, the height, that the character will reach, can be diverse and can be anywhere between Minimum and Maximum Height. It depends then on the input action, e.g. holding jump button to jump higher, just tapping to jump lower.


(Different height jumps in example for Defold platformer engine - Platypus)

:arrow_up: Ascending Speed

It is a speed of going up (or against the gravity vector), a rate at which the character will reach the highest point of the jump. This could be linear or not. If player is allowed to cancel the jump midair, this combined will result in multiple possible outcomes.

:arrow_down: Descending Speed

A speed of going down (or with a gravity vector), a rate at which the character will be descending after reaching the highest point, having a vast influence on the outcome and the controlability of the landing.

The above speeds affect the time in air, the player’s possibility to react and control the landing point, so in result - must influence the whole level design. Platforms to be reached by players must be in their reach with jumps (+all other mechanics).

Both variables does not need to be one and only and constant through the whole game. There are mechanics modifying ascension like stronger jumps (hold and release) or gliding to change the pace of falling down. Rarely, games offer multiple buttons for differently defined jumps, like Mario’s spin jump.

Generally, the most natural jump’s function of vertical height in time is closest to parabolic, but by shaping this differently, you can allow players for more or less precision for landing point.


(Frames forming the vertical position over time function of a jump, Super Mario Maker 2, source)

:fast_forward: Momentum
Describes how much a character’s initial forces before the jump will affect the character in air - it can be heavily influenced by initial momentum and character in the air will not lose inertia or it could be easily lost or there could be no inertia at all. Applying momentum is not possible for predefined jumps, so check out the next factor:

:joystick: Midair control
Describes how much a character can be controlled while performing a jump, while being in the air.

If you do not allow controlling the character in air, player can perform only a predefined jump and modifying the trajectory would not be possible during the jump, like in class Prince of Persia - and this is called a “committed jump”.

If you allow controlling the character in the air - this is called a “variable jump”. You can make totally tight controls and players will be able to move the character in air whenever they like and it will go left or right.

Solutions more closer to real world physics with given inertia to the character might limit this. If you use variable jumps, momentum can affect the power of player’s input on the behavior of the character during the jump, so it could be easier or harder to force it to change the direction in air. While realistic, applying inertia to the character might make it harder (or impossible) to change direction and make players fight the momentum, which might not feel good, but sometimes creates other kind of experience and challenge (like in Super Meat Boy)

image
(Super Meat Boy is heavily affected by momentum, while still offering players a variable jump)

:left_right_arrow: Horizontal Speed

We can determine how fast player can move in horizontal directions (left or right, perpendicular to gravity vector). Whether there is momentum or not, the jump is committed or not, the horizontal speed must be set and it affects the total distance the character can traverse in air. This distance is the next variable:

:straight_ruler: Jump Distance

It’s a total distance the character can jump and determines the possible gaps, thus the whole level design. It can be affected not only by momentum or player’s input for controlling the direction, but also by other mechanics, like double jumps. For committed jumps the jump distance is constant.

:stopwatch: Jump Delay

A variable determining the time between an input action and the actual start of jumping - the Jump Delay. For most of the games the delay is shortened to zero to meet the expectation that the character will immediately be in air after player’s action, while some games might need to take it into consideration, because of animation and wanting to add some more power to the jump feel. Games with committed jumps can make use of the delay to display an animation of anticipation.

princeofpersiajumping
(In classic Prince of Persia the committed jump is delayed after user’s input to display an animation)

:repeat_one: Amount of re-jumps (e.g. Double Jumps)

Additional variable for jumping, enabling a lot of design possibilities is the amount of additional jumps, known in its most common form - double jumps. But there can be multiple jumps too! Amount of jumps could be constant or variable - allowing to create some kind of conditioned jumps, e.g. re-jump possibility is gained in midair when reaching a collectable or performing other action, like killing an enemy or landing on its head.

celeste_shenaningas
(Celeste is a great game to study jumps, especially because the source code is here!)

That’s it!
11 variables defining every possible jump, perfectly described e.g. in the book by Joshua Bycer (referenced at the end).

But wait - we know there’s more - walljumps, dashes. Are you a joke to me? :grin:

Hmmm :thinking: Isn’t a wall jump just another, defined jump, but from some other surface? Isn’t dash a defined, often committed kind of jump or one with very high initial momentum, defined speeds and zero control over its trajectory?

Thinking in such way might make your implementations of the mechanics slightly easier! :wink:


You can also allow other kind of jumps contextually, in certain situations, like for example a special jump, just after landing for some chain actions. A special way of jumping underwater or on other surfaces, like ice, mud, springs.

You can mix different jumps in one game - add springs or trampolines for allowing other kind of jumps, add wind to affect the gravity vector, add underwater parts with totally different jumps, experiment with games on other planets with different gravity (like for example I did in my Secret Moon Station)

All those variables should be locked for level design and must be taken into account when actually developing the levels. Some tweaks can be gained though with the progress as unlockables, like in many metroidvanias. While presented and discussed mainly with 2D examples, all of this perfectly suits to 3D platformers too.

There is a lot of possibilities and configurations for each of the game to feel unique when making jumps and in result platforming. I hope it will help you design and create great games! :heart:


Read more:

Game Design Deep Dive: Platformers by Joshua Bycer
Reverse Design: Super Mario World by Patrick Holleman
David Strachan’s: Tips and Tricks for good platforming games (with example) - Stuff Made By Dave
Rodrigo Monteiro’s: The guide to implementing 2D platformers | Higher-Order Fun
Defold’s : Platformer Defold tutorial

18 Likes

Great article! Thank you for sharing!

4 Likes

Great work! :clap:

2 Likes