Your First Godot 4 Jolt Physics 2D Platformer - One Evening 2026

You do not need a physics PhD to ship a side-view platformer on Godot 4 in 2026. You need Jolt enabled for the 3D backend you actually simulate, a CharacterBody3D with one honest floor, and a receipt that proves the jump landed—not a Discord thread that says “physics feels weird.”
This evening tutorial is the beginner-first open of the Late 2026 engine + local AI + winter discovery cluster. It pairs the deeper node walkthrough in the Godot RigidBody2D / Area2D guide (2D node vocabulary) and the shipping habit in Your First Godot 4.5 Floor-Load Coordinator (evening pipeline discipline). Course forward: Godot 4 project setup. Official reference: Using Jolt Physics.
Ideal title note: Public hook is your first Godot 4 Jolt physics 2D platformer in one evening—keyword + benefit + year. Gates G1–G6 and godot_jolt_platformer_receipt_v1.json live in the body for developers.
Honest scope (read once): In Godot 4.4+, Jolt Physics is the built-in 3D physics engine option (default on many new projects). 2D scenes still use GodotPhysics2D. This URL teaches a 2D-feeling side-view platformer with CharacterBody3D + Jolt (Z locked)—the path that matches the 2026 Jolt discourse—plus a short pure-CharacterBody2D note if you stay flat 2D.
Why this matters now (July 2026)
Godot 4.x Jolt is no longer an “extension experiment” story. Since 4.4, Jolt ships in-engine; new projects often already select it; Discord and jam Discord still fill with teams mixing old GodotPhysics3D habits, leftover extension settings, and CharacterBody2D tutorials that never mention which backend is running. Winter Sale and late-2026 demo branches punish floaty jumps, edge snags, and “it worked on my laptop physics” when a contractor opens the wrong .godot cache.
What changed for micro-studios this quarter:
- Default conversation shifted — “Should we try Jolt?” became “Did you restart after selecting Jolt, and did you document the backend?”
- Ship dates assume Jolt — Partners and co-devs ask which 3D engine is latched before playtest week.
- 2D vs 3D confusion wastes evenings — Searching “Godot Jolt 2D platformer” without a Z-lock plan burns hours.
- Receipt culture beat vibes — Same as BUILD_RECEIPT for uploads: prove
jolt_platformer_okonce, then move on to art and Steam.
Direct answer: Tonight, create or open a Godot 4.4+ project, set Physics → 3D → Physics Engine to Jolt Physics, Save & Restart, build a side-view floor + CharacterBody3D jump, lock Z, file godot_jolt_platformer_receipt_v1.json, clear G1–G6, and latch jolt_platformer_ok: true.
Who this evening is for
| Audience | What you get |
|---|---|
| Creators / beginners | Project → Jolt enable → one solid floor jump without physics theater |
| Developers | G1–G6 gates, receipt JSON, failure modes, backend honesty |
| Companies / leads | Diligence-ready physics_backend + engine version in one artifact |
| Search | Primary keyword: godot 4 jolt physics tutorial |
Time budget: about 3.5–4 hours for a minimal vertical slice (one floor, one jump, one receipt).
Prerequisites: Godot 4.4+ installed; basic GDScript; willingness to restart the editor after changing physics engine.
Who should skip this evening
- Pure CharacterBody2D projects that will never open a 3D scene (use the short 2D appendix; do not pretend Jolt drives 2D).
- Teams mid-port of a large RigidBody3D joint stack that needs the older Jolt extension feature set—read official docs first.
- Anyone who only needs a menu UI tonight (build core loop first).
Evening schedule (four hours)
| Hour | Outcome |
|---|---|
| 0.5 | Inventory project; confirm Godot version; read Jolt vs 2D honesty note |
| 1 | Enable Jolt; Save & Restart; screenshot Project Settings |
| 2 | Floor StaticBody3D + CharacterBody3D capsule; side-view camera |
| 3 | Jump + move_and_slide; Z lock; edge walk test |
| 4 | Gates G1–G6; receipt JSON; jolt_platformer_ok; evidence note |
Non-repetition (what this URL owns)
| Existing URL | Owns | This URL owns |
|---|---|---|
| Floor-load coordinator evening | Threaded floor transitions | Jolt enable + side-view jump receipt |
| RigidBody2D / Area2D guide | Classic 2D node intro | 3D Jolt backend + CharacterBody3D platformer slice |
| Godot VDF LF evening | Export / steamcmd LF | Physics backend latch (orthogonal) |
Forward cluster rows: listicle #2 local LLM tools, challenge #3 Aseprite export, Guide Godot forward, Course 307 forward.
What “2D platformer” means under Jolt
Snippet answer: A Godot Jolt “2D platformer” in 2026 usually means a side-view CharacterBody3D scene with movement on X/Y, Z locked, camera orthographic or constrained, and Jolt as the 3D physics engine—not CharacterBody2D driven by Jolt.
Why that matters:
- Tutorials that only say “enable Jolt” then paste CharacterBody2D code leave readers wondering why Project Settings never changed gameplay.
- Side-view 3D keeps capsule collisions, floor snaps, and future 3D props without a second engine story.
- Pure 2D is still valid—just name the backend GodotPhysics2D in your receipt so partners are not lied to.
If you already live in Node2D forever, complete the Pure CharacterBody2D appendix at the end, then set jolt_platformer_ok to false with reason 2d_only_godot_physics_2d—honest RED beats fake GREEN.
Prerequisites checklist (15 minutes)
Print or paste into your evening note:
- [ ] Godot 4.4, 4.5, or 4.6 (Help → About)
- [ ] New project or a throwaway branch (do not A/B physics on main without a receipt)
- [ ] Folder
release-evidence/jolt-platformer-evening/at repo root - [ ] Keyboard with Space / A–D (or remap later)
- [ ] Official doc tab open: Using Jolt Physics
Beginner mindset: You are not tuning a Metroidvania. You are proving one jump on one floor under a named backend.
Step 1 - Confirm engine version and physics honesty (G1 start)
Open Project → Project Settings. Enable Advanced Settings.
Navigate to Physics → 3D → Physics Engine.
| Value | Meaning for tonight |
|---|---|
| Jolt Physics | Built-in module (preferred for new 4.4+ work) |
| Godot Physics | Legacy 3D backend—document if you keep it |
| Jolt Physics (Extension) | Older addon path—avoid mixing with built-in on the same project |
G1 (partial): Record godot_version and physics_3d_engine exactly as shown.
If you change the engine, click Save & Restart. Skipping restart is the #1 false-negative of the evening—settings look right, runtime still uses the old backend until editor reload.
Evidence: Screenshot project_settings_physics_3d.png into release-evidence/jolt-platformer-evening/.
Pair shipping discipline from the floor-load evening: one artifact folder per evening, not scattered Desktop PNGs.
Step 2 - Scene layout for a side-view slice
Create res://levels/jolt_sideview_lab.tscn with:
Node3D (root)
├── Floor (StaticBody3D)
│ ├── MeshInstance3D (BoxMesh size 20, 1, 4)
│ └── CollisionShape3D (BoxShape3D matching mesh)
├── Player (CharacterBody3D)
│ ├── MeshInstance3D (CapsuleMesh)
│ └── CollisionShape3D (CapsuleShape3D)
└── Camera3D (orthogonal or perspective, looking along +Z toward origin)
Why a thick floor on Z: Side-view players still need depth so capsules do not fall “beside” thin plates when Z drifts. Start with floor depth 4 units; tighten later.
Camera tip: Place Camera3D at (0, 4, 12), look at origin, set Projection to Orthogonal with size ~10 for a readable 2D feel. Creators filming a Discord clip get a cleaner frame than a free fly camera.
Step 3 - Player script (move + jump)
Attach player_sideview.gd to Player:
extends CharacterBody3D
@export var speed: float = 6.0
@export var jump_velocity: float = 8.0
@export var lock_z: bool = true
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
func _physics_process(delta: float) -> void:
if not is_on_floor():
velocity.y -= gravity * delta
var input_x := Input.get_axis("ui_left", "ui_right")
velocity.x = input_x * speed
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = jump_velocity
if lock_z:
velocity.z = 0.0
global_position.z = 0.0
move_and_slide()
if lock_z:
global_position.z = 0.0
Why lock Z twice: move_and_slide() can introduce tiny Z corrections on uneven contacts. Creators who “feel drift” after five minutes usually forgot the post-slide clamp.
G2: Floor collision exists; player capsule does not start intersecting the floor (lift Y to ~1.1).
G3: From rest on floor, press jump once—is_on_floor() becomes false, then true again within a sane hang time (not infinite float, not instant teleport).
Map ui_left / ui_right / ui_accept in Project Settings → Input Map if needed (defaults often already exist).
Step 4 - CharacterBody3D floor settings that matter under Jolt
In the Inspector on Player (CharacterBody3D):
| Property | Starter value | Why |
|---|---|---|
floor_snap_length |
0.15 |
Reduces edge stutter when walking off 1-unit blocks |
floor_max_angle |
0.785 (~45°) |
Keeps walls from counting as floors |
safe_margin |
0.001 |
Default; raise slightly only if tunneling appears |
up_direction |
(0, 1, 0) |
Side-view gravity world |
Do not crank every Jolt solver slider on night one. Official docs warn that advanced physics/jolt_physics_3d knobs are for known symptoms—not vibes. If the jump already works, leave defaults and write the receipt.
When you do need tuning later, settings live under Project Settings → Physics → Jolt Physics 3D (category renamed from older physics/jolt_3d paths). Restart after material changes if the editor prompts.
Step 5 - Edge walk and one-block test (G3 complete)
Add a second StaticBody3D box as a one-unit step at x = 4. Walk onto it; walk off; jump onto it from the low floor.
Pass criteria:
- No tunneling through the step.
- No sticky corner that traps the capsule for >0.5 s.
- Landing restores
is_on_floor() == truewithin two physics frames of contact (print once for the receipt).
Optional debug:
func _physics_process(delta: float) -> void:
# ... movement above ...
if Engine.get_physics_frames() % 30 == 0:
print("on_floor=", is_on_floor(), " vel=", velocity)
Remove prints before you ship; keep a log snippet in evidence if a partner asks.
Step 6 - File the evening receipt (G4–G6)
Create release-evidence/jolt-platformer-evening/godot_jolt_platformer_receipt_v1.json:
{
"schema": "godot_jolt_platformer_receipt_v1",
"date_iso": "2026-07-18",
"godot_version": "4.x.x",
"physics_3d_engine": "Jolt Physics",
"scene_path": "res://levels/jolt_sideview_lab.tscn",
"player_node": "CharacterBody3D",
"lock_z": true,
"jump_landed_ok": true,
"edge_walk_ok": true,
"project_settings_restart_done": true,
"gates": {
"G1": true,
"G2": true,
"G3": true,
"G4": true,
"G5": true,
"G6": true
},
"jolt_platformer_ok": true,
"notes": "Side-view CharacterBody3D under built-in Jolt; pure 2D N/A."
}
Wire a one-line pointer in your studio BUILD_RECEIPT or evening pass markdown:
jolt_platformer: release-evidence/jolt-platformer-evening/godot_jolt_platformer_receipt_v1.json
jolt_platformer_ok: true
G4: JSON validates (no trailing commas; engine string matches Project Settings).
G5: lock_z: true and camera side-view noted.
G6: Evidence folder contains screenshot + receipt; latch jolt_platformer_ok.
Companies evaluating a contractor zip open this file before they argue about “floaty feel.” Same diligence pattern as Steam upload receipts—different surface.
Gate catalog G1–G6 (printable facilitator card)
| Gate | Check | RED if… |
|---|---|---|
| G1 | Godot 4.4+; Physics 3D engine = Jolt Physics; Save & Restart done | Version unknown or restart skipped |
| G2 | Floor StaticBody3D + matching CollisionShape3D; player starts above floor | Mesh without collision; spawn inside geometry |
| G3 | Jump leaves floor and lands; edge/step walk without trap | Infinite hang, teleport, or sticky corner |
| G4 | godot_jolt_platformer_receipt_v1.json filed with matching backend string |
Missing JSON or wrong engine name |
| G5 | Side-view camera + Z lock documented in receipt | Free-fly only; Z drift ignored |
| G6 | Evidence folder + jolt_platformer_ok latch |
Green Discord claim without artifact |
Latch rule: jolt_platformer_ok is true only when G1–G6 are all true. Partial progress stays false with blocked_gate filled.
Trend section - What studios argue about Jolt in 2026
Three recurring threads you will hear this month:
- “Jolt broke my joints” — Often leftover extension expectations or scaled collision shapes. For CharacterBody3D platformers, start clean: no custom joints on night one.
- “I enabled Jolt but 2D still feels the same” — Correct: 2D is not Jolt. Say so in the receipt.
- “Defaults are fine until Winter Sale” — Defaults are fine for tonight’s GREEN; Winter Sale demo week still wants this receipt so a contractor does not “helpfully” flip Godot Physics back.
Discuss the trend in stand-up with one sentence: We latch the backend before we tune the feel. That sentence is the company-facing governance signal.
Common mistakes (and fast fixes)
Mistake 1 - Changed Physics Engine without restart
Symptom: Settings show Jolt; behavior matches old Godot Physics quirks.
Fix: Save & Restart. Re-run jump. Update receipt project_settings_restart_done.
Mistake 2 - CharacterBody2D tutorial pasted into a Jolt evening
Symptom: Confusion; no 3D settings touched.
Fix: Either finish the CharacterBody3D path above or mark receipt 2d_only and stop claiming Jolt.
Mistake 3 - Paper-thin floor on Z
Symptom: Player falls “off the world” when Z drifts 0.05 units.
Fix: Thicker floor; hard Z lock; optional invisible Z walls at ±0.1.
Mistake 4 - Jump while not on floor still adds velocity every frame
Symptom: Rocket jumps if is_action_pressed used instead of just_pressed.
Fix: Use is_action_just_pressed("ui_accept") and gate on is_on_floor().
Mistake 5 - Tuning Jolt solver before proving G3
Symptom: Evening lost in slider theater.
Fix: Freeze project settings; only change CharacterBody3D floor snap first.
Mistake 6 - No evidence folder
Symptom: Next week nobody remembers which build was GREEN.
Fix: release-evidence/jolt-platformer-evening/ with PNG + JSON—same habit as BUILD_RECEIPT beginners.
Beginner path vs developer path (same evening)
Beginner path (first 2 hours):
- New project → enable Jolt → restart.
- Floor + capsule + script above.
- Jump once. Celebrate.
- Fill receipt with help from the table.
Developer path (hours 3–4):
- Add step collision + edge walk.
- Assert gates in a tiny editor tool or CI note.
- Cross-link BUILD_RECEIPT.
- Note Godot minor version for partner zip.
- Decide whether Winter Sale demo stays CharacterBody3D or adds a pure 2D skin later.
Both audiences share one URL—creators get the schedule; developers get the latch.
Enterprise / company diligence notes
When a publisher or platform partner asks “which physics?”, answer with the receipt fields—not a Slack emoji.
| Diligence question | Field |
|---|---|
| Engine version | godot_version |
| 3D backend | physics_3d_engine |
| Proof of jump | jump_landed_ok + optional short clip path |
| Ownership | Who signed jolt_platformer_ok in the evening note |
| Risk | notes if extension vs built-in, or 2D-only exception |
Cost/ROI: Four hours now beats a mid-demo physics flip that invalidates QA. Governance: Only leads latch jolt_platformer_ok after G1–G6. Security/privacy: N/A beyond not committing secrets in evidence screenshots.
Pure CharacterBody2D appendix (if you refuse 3D)
If product truth is Node2D forever:
- Keep Physics → 2D on GodotPhysics2D.
- Build CharacterBody2D + StaticBody2D floor (see RigidBody2D guide for node roles—prefer CharacterBody2D for player control).
- File a receipt with
"physics_3d_engine": "n/a","physics_2d_engine": "GodotPhysics2D","jolt_platformer_ok": false,"alternate_ok": "character_body_2d_evening". - Do not title your Discord update “Jolt done.”
This appendix keeps search intent honest and prevents keyword theater.
Optional verify sketch (bash / PowerShell)
PowerShell (Windows teams):
$receipt = Get-Content release-evidence/jolt-platformer-evening/godot_jolt_platformer_receipt_v1.json -Raw | ConvertFrom-Json
if (-not $receipt.jolt_platformer_ok) { throw "jolt_platformer_ok false" }
@("G1","G2","G3","G4","G5","G6") | ForEach-Object {
if (-not $receipt.gates.$_) { throw "Gate $_ RED" }
}
Write-Host "jolt_platformer_ok GREEN"
Bash cousin:
jq -e '.jolt_platformer_ok == true and (.gates | all(. == true))' \
release-evidence/jolt-platformer-evening/godot_jolt_platformer_receipt_v1.json
Pair later with Winter Sale local smoke (cluster #10) when you upload a build that claims this latch.
Scenarios A–F (decision table)
| ID | Situation | Action |
|---|---|---|
| A | New 4.5 project already on Jolt | Still screenshot + receipt; do not skip G1 |
| B | Old project on Godot Physics 3D | Flip to Jolt on a branch; re-test jump; compare notes |
| C | Extension and built-in both installed | Pick one; remove the other from the evening scope |
| D | Jump works, Z drifts | Enforce lock; thicken floor |
| E | Pure 2D only | Appendix path; jolt_platformer_ok false with reason |
| F | Partner asks for proof Friday | Send JSON + one 10-second clip; no live editor tour |
How this pairs with the rest of the site
- Guide: Physics RigidBody2D / Area2D — node literacy for 2D cousins.
- Blog: Floor-load coordinator — next evening once rooms exist.
- Course: Godot 4 project setup lesson — architecture naming.
- Blog export: Godot VDF LF proof — when Linux CI uploads the build that contains this lab.
- Help / Resource: forward Help #48 / Resource #46 when local LLM NPC tools land in cluster #2.
After tonight - what not to do Monday
- Do not retune every Jolt slider because Twitter said so.
- Do not merge physics backend flips without updating the receipt date.
- Do not start Winter Sale capsule art before
jolt_platformer_okif movement is still RED. - Do not claim “Jolt 2D” in store copy—say side-view or 2D gameplay on 3D physics if that is the truth.
Next cluster share hooks for creators: local LLM tool list (#2), Aseprite pixel export challenge (#3).
Key takeaways
- Godot 4.4+ Jolt is the 2026 3D physics default conversation—enable it, Save & Restart, and name it in a receipt.
- A “Jolt 2D platformer” evening means side-view CharacterBody3D + Z lock, not CharacterBody2D powered by Jolt.
- Clear G1–G6, file
godot_jolt_platformer_receipt_v1.json, latchjolt_platformer_ok. - Prove one solid floor jump and an edge/step walk before solver theater.
- Pure 2D projects stay on GodotPhysics2D and must not fake a Jolt GREEN.
- Companies want backend + version fields; creators want a four-hour schedule; search wants godot 4 jolt physics tutorial.
- Pair floor-load and export evenings later—physics latch first.
- Official docs remain the source of truth for setting renames under
physics/jolt_physics_3d.
FAQ
Does Jolt Physics replace Godot 2D physics?
No. Jolt in Godot 4.4+ is the 3D physics engine option. 2D continues to use GodotPhysics2D. This tutorial builds a side-view CharacterBody3D platformer under Jolt for the 2026 Jolt discourse.
How do I enable Jolt Physics in Godot 4?
Open Project Settings (Advanced), go to Physics → 3D → Physics Engine, choose Jolt Physics, then click Save & Restart. Confirm after reload before you trust gameplay.
What is the fastest beginner path for a Jolt platformer?
New or throwaway project, enable Jolt, place a StaticBody3D floor and CharacterBody3D capsule, paste the move_and_slide jump script, lock Z, then file the receipt. About one evening.
What does jolt_platformer_ok mean?
It is the latch that all gates G1–G6 passed and godot_jolt_platformer_receipt_v1.json matches the project’s real physics backend and jump proof.
Should I use CharacterBody2D or CharacterBody3D?
Use CharacterBody3D if you want Jolt involved. Use CharacterBody2D for flat 2D-only games and document GodotPhysics2D—do not claim Jolt.
Why does my player drift on Z?
move_and_slide and uneven contacts can nudge Z. Set velocity.z = 0 and clamp global_position.z after moving; thicken the floor.
Is the old godot-jolt extension still required?
Usually no for new 4.4+ work—the engine module is built in. Prefer built-in Jolt Physics unless you need extension-only joint features; do not mix both casually.
How does this help Winter Sale or demo week?
It gives a dated artifact so contractors and partners agree which physics backend the demo build used—before discount traffic or playtest week exposes floaty jumps.
Conclusion
2026 Godot teams do not win by arguing physics on Discord. They win by enabling Jolt, shipping a side-view jump that lands, and filing godot_jolt_platformer_receipt_v1.json so jolt_platformer_ok is a fact. Spend one evening on G1–G6, then move to floors, art, and store work with a backend you can defend.
Bookmark this page for the next hire’s first Godot night—and when cluster #2 local LLM tools land, keep the same receipt habit for dialogue stacks.
Related reads
- Your First Godot 4.7 VirtualJoystick - Mobile Controls One Evening 2026
- Godot 4.7 Upgrade Lock - HDR AreaLight3D and Asset Store Before Ship - 2026
- 14 Free Local LLM Tools for Indie Game Dialogue and NPCs - 2026
- Your First Godot 4.5 Floor-Load Coordinator - One Evening
- Godot Physics - RigidBody2D and Area2D
- Your First Godot Export VDF LF Line Ending Proof
- Your First BUILD_RECEIPT JSON and Upload Log
- Godot 4 Project Setup - Course Lesson
- Using Jolt Physics - Godot Docs