5 Common Mistakes in Godot 4 Platformer Games
Platformer games are simple to make, yet hard to master. Your player clips through floors. Enemies detect randomly. Jumps feel floaty. Sound familiar?
If you plan to make a platformer game, especially in Godot 4, you need to avoid these five mistakes I'm going to show you.
Why Platformers Are Tricky
The fact that platformers are heavily physics dependent adds a cognitive barrier right at the door: you have to know basic physics.
Some engines offer built-in solutions, like Unity's RigidBody and Godot CharacterBody, but walking and jumping isn't enough nowadays. Combat systems, NPC interactions, and even puzzles can all get tricky if you don't approach them right.
For example, a friend of mine came to me asking if it would be a "good approach" to implement a grappling hook switching between CharacterBody2D and RigidBody2D. My answer is always: depends. Because it really does.
Your player character is not his body. He has a body
— Henrique Campos
Mistake #1: Making Your CharacterBody the Scene Root
Your player is more than just a moving body. It has an inventory, resources to manage, graphics, animations to play, and more. Think of your player as "having" a body. In that sense, you can swap this body however you want without messing around with other player properties.
Mistake #2: Concentrating Responsibilities
Your player should be a composition of individual components that handle themselves, not a monolithic "know it all" class. Use it for very specific interactions between these components, otherwise let the systems handle themselves.
For instance, don't add "health management" logic in the player script. You can use something like a GameResource for that:

Mistake #3: Using Node Groups for Filtering
Godot Node Groups is an amazing feature that allows us to make batch calls and easily implement ECS-ish features, but people use them for filtering collisions like if area.is_in_group("enemies") to deal or receive damage or if area.is_in_group("NPC") to trigger an interaction.
It's way better to isolate these systems into Physics Layers using Collision Masks and Collision Layers to ensure they only interact with the proper components of the system.
Mistake #4: Mixing State Machines
State Machines are good when you limit the set of states ONE OBJECT should be, but if you start to mix the states of your movement object (walking, jumping, dashing) with the states from your combat objects (idle, shooting, cooling) you get exponential possibilities of states.
Instead, split and isolate them into individual state machines and let them handle their states accordingly. If your character can shoot while dashing, toggle both states. If your character shouldn't shoot while dashing, change the combat state to "disabled" and reenable it upon finishing the dash. This way you don't need weird "hierarchical state machines" with states like "shooting-while-dashing-in-the-air".
Mistake #5: Not Using Checkpoints
Platformer games are all about challenging the players' ability to solve movement-based puzzles. Failing to solve these puzzles should lead to some loss (a punishment). Typically we use a progress loss: players lose some of the progress they did in the level.
Depending on the skill test you're applying to your player it may not be fair to reset the whole level making the player lose all the progress. You have to proportionally punish your player, maybe lose some progress, maybe moving them back to where you design a segment to teach them such skills, or maybe just move them back to the cliff right before they missed a jump.
Regardless of how much progress you want your player to lose, you can use Checkpoints as milestones of progress. A simple Area2D that automatically stores the player's position once they detect the player and when reloading the level, the player moves to the most recent Checkpoint. We have a whole chapter about Checkpoints in the Platformer Essentials Cookbook if you got interested.
Final Thoughts
To know more about design and development of platformer games, follow me by clicking on "Follow Ludonaut" at the top right corner. And if you liked this kind of post, leave a like! This way you are communicating you want more of this so I can create more of it. Which mistake surprised you the most? Let us know in the comments.
To keep the wheel spinning, check out our post on Making a Playable Level using the content offered in the Platformer Essentials Cookbook.
And if you need help or want to talk more about making platformer games with Godot, join 443 indie game devs in our Discord community:
Get Godot Platformer Essentials Cookbook
Godot Platformer Essentials Cookbook
Step-by-step tutorials with essential features to create platformer games
| Status | Released |
| Category | Book |
| Author | Ludonauta |
| Genre | Educational, Platformer |
| Tags | 2D, Boss battle, flat-shading, Godot, Itch Funding, Open Source, Tutorial |
| Languages | English |
| Accessibility | Color-blind friendly, High-contrast |
More posts
- Making a Bomb for Godot Platformers with the Hazard RecipeJan 19, 2026
- Weekly Update: Playable Demo and Main ChaptersJan 16, 2026
- Remove 90% of Conditional Statements and Bugs from Your Game: Strategy PatternJan 02, 2026
- How to Make an Interaction System in Godot 4Dec 30, 2025
- 5 Tricks to Enrich Your World DesignDec 29, 2025
- Weekly Update: State Machines and Interactive AreasDec 26, 2025
- RigidBody vs CharacterBody: Which One for Your Platformer?Dec 10, 2025
- Combat System Update: Hit&Hurt Areas and Bumping EnemyDec 05, 2025
- Slope Movement Is So Hard (unless you use Godot Engine)Nov 25, 2025

Comments
Log in with itch.io to leave a comment.
Very good points! Most people only seem to think to have a single state machine on their player character, but I find it better to have one state for movement actions and separate state machine for attack actions --for the reasons you mention. Two small state machines working in conjunction are easier to manage than one giant state machine unless the player character is very simple.
It's a lot easier to manage and gives you the double benefit of reusing them on other objects!
One trick I always use is saving my AnimationTree Finite State Machines to reuse on other nodes if I need to.