Super Meat Boy and Spelunky sit atop my list of all-time favorite games. These games are popular platformers that were wildly successful upon release. The theme, design, audio, and visuals are important, but what pushes these games over the top is how they feel.
Platformers are often very difficult, which requires the controls to be very fluid and precise. I have had the pleasure of programming two rather challenging, fast-paced platform games and I would like to share what I think makes those games stack up to some of the platformer greats.
A strong sense of speed is both fun and important. There are exceptions to this, but I am mainly speaking for platformers where the actual act of platforming is the key feature. Examples of this being Super Meat Boy, N+, etc. Speed often makes the player feel like they have more control; like the character is more acrobatic and agile. Even keeping all of the physics in tact while changing the overall game speed can do the job.
Gotta Go Fast!
This is more of an opinion thing and will differ from game to game, but it is an important topic. I am speaking about how the player character reacts when the player is NOT giving controller input. Does the character slide along the ground? Does he stop on a dime? Somewhere in between? How about in the air?
I have found that a higher friction value on the ground feels best. The character stops moving within one or two frames of no input. However, I almost always use two friction values. The second is VERY low and is used when the character is in the air. This mimics a more natural jump arc (people can’t stop and turn around after committing to a jump) while giving the player a unique amount of control over the character while falling.
Immediately releasing control stick after jumping
A proper wall jump is what I like to call a “duct-tape wall jump”. It doesn’t make sense. It doesn’t try to be realistic by any stretch of the imagination.
I create the duct-tape wall jump by taking the players intentions into consideration. By that I mean “What does the player want to accomplish with this jump?”. There are really only two options. The player either wants to climb/hug the wall that they are on OR they want to jump away from the wall. You can tell which they aim to achieve by checking the control stick input and acting accordingly. If the player is pressing towards the wall, I kick him away from the wall with a minimal horizontal force and a maximal vertical force. This will help the player move higher up the wall. If the player is pressing away from the wall, I switch the values. This will push the player straight out and away from the wall.
The jump arc is what changes. When hugging the wall, it should be fairly spherical so that you can jump up and around obstacles attached to the wall.
Another side effect of how the player thinks about how a wall jump should work. Prior to wall jumping (when targeting something AWAY from the wall), the player will press the control stick away from the wall. This will often lead to the player moving away from the wall and falling before being able to press the jump button. This can be stressful and causes the player to always feel like input needs to be delayed. Jump, wait, hit control stick.
To combat this, we can add a timer when trying to push away from the wall. If a player has an adjacent wall to his or her left, start a timer when they try to move right. If time runs out, let them move away from the wall. It is likely that they will try to jump prior to the timer elapsing.
I prefer 4-8 frames
If all else fails, give the player more feedback. Show them that they are moving fast. Make stuff react to the player.
In the following GIF, I create dust when running, create dust when jumping/wall jumping/landing, squash + stretch sprite when jumping/landing, and move plants, grass, and vines when running by.
Thank you for reading!