Video summary

The new ultimate introduction to Godot

Main summary

Key takeaways

Educational

Main ideas / lessons from the video

Course overview (Godot + game-building approach)

  • The instructor introduces a “learn coding by making games in Godot” course.
  • The goal is to build seven games using Godot (free, open-source), progressing from fundamentals to more advanced topics.
  • Intended game order:
    1. Runner game
    2. Platformer
    3. Farming game
    4. Monster battle game
    5. 3D space shooter
    6. 3D platformer
    7. 3D shooter
  • Prerequisites: none assumed (it expects no prior coding). Existing coders can skip early sections.
  • This video’s intro content includes:
    • Coding introduction
    • 3 mini-games: runner, platformer, and a basic 3D shooter

How games work + what a game engine does (conceptual model)

  • A game is described as an “interactive movie.”
  • Frames are shown rapidly:
    • Movies run around ~24 fps
    • Games aim for ~30+ fps
  • Key difference: in games, frames are calculated dynamically based on runtime conditions:
    • Player input
    • Enemy movement
    • Timers
    • Other game state at runtime
  • High-level engine loop:
    • Compute changes (input, object states, defeated enemies, etc.)
    • Render/draw one frame
    • Repeat until the game ends
  • Godot capabilities highlighted:
    • Input capture
    • 2D/3D drawing
    • Sound
    • Advanced features like physics, lighting simulation, and online communication

Godot setup + editor fundamentals

Installation

  • Download from godotengine.org → “download latest”
  • Godot typically does not require installation—run it from the extracted folder.

Project workflow

  • Choose a new project name and project path
  • Renderer choice: Forward plus (recommended/used)
    • Also mentions mobile/compatibility constraints

Editor customization

  • Editor settings → interface/editor:
    • Display scaling (for readability on a phone)
  • Theme selection:
    • Avoid the default blue theme; gray is preferred
  • Fullscreen shortcut:
    • Shift + F11

Workspace modes (panels + hotkeys)

  • Panels for 2D/3D/script/asset library
  • Hotkeys:
    • F1 = 2D
    • F2 = 3D
    • F3 = script

UI elements and content placement

  • Viewport: main 2D/3D scene view
  • Scene panel / scene tree: node hierarchy
  • Inspector: properties of the selected node
  • Workflow tips:
    • Drag image files into the viewport for quick tests
    • Prefer using the Scene panel to add nodes properly

Node types and examples

  • Timers, AnimationPlayer, AnimatedSprite2D, GPUParticles, Camera
  • Collision nodes:
    • CollisionShape / CollisionObject2D variants like Area2D

Naming and conventions

  • Prefer no spaces for coding.
  • Use capitalization for multiple words (e.g., StickFigure)
  • Use consistent naming to reduce confusion in code

Core architecture: Nodes + Scenes (how everything is organized)

Nodes (building blocks)

  • Nodes are fundamental elements (images, timers, sounds, 3D objects, animations, etc.).
  • Godot provides hundreds of nodes grouped by type/category:
    • 2D nodes (often blue)
    • UI nodes (green)
    • 3D nodes (red)
    • Shared/other (white-ish)

Scenes (containers + what gets displayed)

  • A scene:
    1. Contains nodes (container role)
    2. Represents what appears in the game (level, character, etc.)
  • Scenes can be instantiated inside other scenes for complex projects.

Parent/child/sibling behavior in the scene tree (important rules)

  • Parent affects child:
    • Child inherits transformations (moving/rotating/scaling parent changes children)
  • Child does not affect parent
  • Siblings do not affect each other
  • Children can be attached by dragging one node onto another in the scene tree.

Practical node workflow exercise: build a stick figure scene

  • Create a new 2D scene → add a root node (rename using recommended style).
  • Add multiple Sprite2D nodes using a texture (icon.svg).
  • Use the Inspector transform controls for:
    • scale
    • rotation
  • Build a hierarchy using parent/child relationships so that torso scaling affects the head, etc.
  • Example result:
    • Save as stickfigure.tscn
  • Demonstrate scene nesting by instantiating it into another scene (e.g., “first scene”).

Running the game + coordinate system basics

  • F5 runs the configured “main scene” (set in run settings).
  • Coordinate system:
    • Origin is top-left: (0,0)
    • X increases to the right
    • Y increases downward (so moving up requires negative Y)
  • Emphasis: resetting/placing nodes is done via position values.

Scripting basics: GDScript + functions + Godot lifecycle

Adding scripts

  • Attach a script to a selected node.
  • Script defaults:
    • Language: GDScript
    • Inherit type should match node type.

Functions + indentation as scope

  • Godot code must live inside functions.
  • Lifecycle functions:
    • ready():
      • Called when the scene is ready
    • process(delta):
      • Called every frame (constantly)
    • Later also shown:
      • _physics_process(delta) for physics-timed updates
  • Function syntax:
    • func function_name(...):
    • Indentation defines code that belongs to that function.

Calling functions

  • Special case:
    • ready() is called automatically by Godot
  • Built-in functions:
    • print() is called by the developer
  • Custom example:
    • Create a something() function and call it from ready().

Core programming logic (math, variables, data types, flow control)

Logic with math and operators

  • Examples:
    • 2 + 2
    • 2 - 2
    • 2 * 3
    • 9 / 3 (integer division rounding noted)

Documentation reliance

  • Use:
    • In-editor help search
    • Online GDScript reference documentation (Godot docs)

Exercise example: Pythagoras

  • Compute c = sqrt(a^2 + b^2) using GDScript:
    • Squaring: value ** 2
    • Square root: (... ) ** 0.5
    • Parentheses control operation order

Variables

  • Declare: var name = value
  • Naming rules:
    • No starting with a number
    • No spaces/special symbols
  • Suggested convention:
    • snake_case (e.g., side_a, side_b)
  • Execution order matters:
    • Code runs line-by-line; reassignments change results

Data types emphasized

  • Strings (quoted)
  • Integers vs floats:
    • Integer division truncates decimals
    • Use floats (e.g., 2.0 / 3.0) for real division
  • Booleans: true/false
  • Arrays, dictionaries, vectors introduced as core structures

Type enforcement

  • Use type annotations with : (e.g., var x: int) to prevent invalid assignments and confusing errors.

Properties & methods on objects

  • Properties and methods belong to objects (e.g., Sprite2D position/rotation/scale)
  • Access pattern:
    • node_reference.property
    • node_reference.method(args)
  • Use $node_name or inspector-dragging nodes into scripts for references.

Booleans and flow control

  • Comparisons:
    • <, >, <=, >=, ==, !=
  • Condition operators:
    • and, or
  • Control structures:
    • if / elif / else
    • while (caution: can crash the game if the condition never becomes false)

Movement and simulation (properties, physics, delta)

Moving via physics vs transform

  • Physics bodies should move via:
    • velocity + move_and_slide()
  • Moving directly via transform properties (e.g., Sprite transforms):
    • can become frame-rate dependent unless scaled using delta

delta time (frame-rate independence)

  • Problem:
    • “pixels per frame” varies with FPS
  • Solution:
    • Use delta when updating transforms (conceptually):
      • position += movement_per_second * delta
  • For physics bodies:
    • Godot handles timing appropriately when using move_and_slide().

Data structures for game logic (arrays/dictionaries/vectors)

Vectors (most important)

  • Vector2: (x, y) for 2D positions/directions
  • Vector3: (x, y, z) for 3D
  • Vector math:
    • add vectors
    • multiply vector by a scalar (affects both components)
  • Vectors include common helper constants and operations.

Vectors as direction & velocity

  • Bounce movement exercises combine vectors with boundary checks.

Arrays

  • Format: [a, b, c]
  • Indexing starts at 0 (negative indexes allowed for reverse indexing)
  • Iteration: for ... in ...

Dictionaries

  • Format: { key: value, ... }
  • Access via keys: dict[key]
  • for ... in dict iterates keys by default
  • Mentions using dictionary helpers to iterate values.

Functions advanced concepts: scope and return values

Scope (global vs local)

  • Variables declared at the script top are effectively “global” within the script (available anywhere in that script).
  • Variables inside functions are local and not accessible elsewhere.

Return values

  • Return type annotation example:
    • -> int
  • Use return value and treat the call as part of expressions.
  • Exercise example:
    • calculate(num1, num2, operator) -> int
    • Uses if/elif on operator string
    • Returns computed result instead of printing

Methodology / detailed instruction lists

A) Godot engine “frame loop” (conceptual steps)

  • Compute state changes using:
    • player input
    • object movement
    • timers and game logic
  • Draw/render the updated frame
  • Repeat at 30+ fps until the game ends

B) Building scenes with nodes (practical steps)

  • Create a new scene (2D or 3D root)
  • Add nodes via the Scene panel:
    • Start with root node (e.g., Node2D / Node3D / CharacterBody2D / ...)
  • Configure node properties in Inspector:
    • set texture for Sprite2D
    • configure transform (position/rotation/scale)
  • Use scene tree parenting for transformation cascading
  • Save scene as .tscn
  • Instantiate scenes inside other scenes to compose the project

C) Coding in Godot (script structure)

  • Attach a script to a node
  • Implement logic inside:
    • func _ready(): (initialization)
    • func _process(delta): (per-frame logic)
    • func _physics_process(delta): (physics-timed logic)
  • Use indentation to define blocks
  • Use print() for debugging

D) Input handling instructions

  • Add actions in Project Settings → Input Map
  • Use:
    • Input.is_action_pressed("action") for continuously held input
    • Input.is_action_just_pressed("action") for one-time triggers
  • Prefer just_pressed for single-shot events

E) Making movement frame-rate independent

  • If moving via transform properties:
    • multiply by delta
  • If moving via physics bodies:
    • use velocity + move_and_slide() and let Godot handle timing

F) Signals workflow (timers, collisions, areas)

  • Use node signals like:
    • Timer timeout
    • Area2D body_entered
  • Connect the signal to a script method:
    • via editor UI (double-click)
    • or via GDScript node.connect("signal", callable)
  • Ensure the callback signature matches the signal arguments (e.g., if a signal passes body, your function must accept it).

G) Spawning objects via timer (example pattern)

  • Create a Timer node (interval).
  • On timeout:
    • preload a PackedScene
    • instantiate it
    • add it as a child to the right container node
    • set initial position/rotation/velocity-like variables
  • Recommended cleanup:
    • When offscreen, destroy with queue_free() (often using a VisibilityNotifier in 2D/3D)

H) Collision setup (2D and 3D basics)

  • Convert visuals-only nodes into physics nodes by:
    • using the correct body type (StaticBody/CharacterBody/RigidBody)
    • adding CollisionShape nodes
  • For 2D character movement:
    • use velocity + move_and_slide()
  • Use collision layers/masks to prevent unwanted overlap events
  • For 3D:
    • be mindful of shape type limitations (concave collision mentioned)

I) Y-sorting (2D draw order)

  • Enable Y sort on a container node (e.g., a parent called objects)
  • Ensure collision shapes overlap only where intended to simulate depth.

J) UI layout anchors (relative placement)

  • Use UI Control nodes
  • Set Layout → Layout Mode = Anchors
  • Configure anchor points (normalized 0..1 screen percentages)
  • Adjust with pixel offsets
  • For HUD tied to camera:
    • place it under CanvasLayer

K) Global data between scenes

  • Create a global node scene (global.tscn)
  • Register it as a global in Project Settings (Globals)
  • Read/write shared values across scenes (e.g., global.score)

L) Scene transitions with physics safety

  • When switching scenes from within physics callbacks:
    • use call_deferred() to avoid “removing nodes during physics callback” errors
  • Then call:
    • get_tree().change_scene_to_file("path") in the deferred function

Game/project concepts demonstrated (what was actually built)

Game 1 (2D top-down / Frogga-style)

  • Scenes for game + player
  • Pixel art scaling fixes:
    • set texture filter to nearest
  • Movement:
    • direction vectors + input.get_vector
  • Camera:
    • follow + zoom + limits
  • Collisions:
    • Player as CharacterBody2D
    • Trees/borders as StaticBody2D with CollisionShape2D
  • Animations:
    • AnimatedSprite2D frames for direction and jump animation
    • flip_h based on direction
  • Cars:
    • spawn via Timer + PackedScene instantiation
    • per-frame movement, visibility cleanup, offscreen destruction
    • collisions handled with signals + corrected using collision layers/masks
  • Depth:
    • Y-sorting enabled for correct foreground/background drawing
  • Title screen + score:
    • UI anchors + CanvasLayer for HUD
    • timer-based “time elapsed” score
    • scene transitions with global score storage
  • Audio:
    • AudioStreamPlayer (music)
    • AudioStreamPlayer2D (car/explosion)
    • (Later 3D course uses 3D audio)
    • autoplay/loop and tuning max distance

Game 2 (Metroid-style platformer)

  • Platformer movement:
    • left/right using get_axis/get_vector equivalents
    • jumping using is_on_floor and gravity
  • Shooting:
    • reload timer
    • bullets move frame-rate independently
  • Custom signals:
    • between player and level to spawn bullets
  • Mouse aiming:
    • get_local_mouse_position + normalized direction
  • Animations:
    • AnimationPlayer for leg run/idle/jump
    • AnimatedSprite torso direction via dictionary mapping
  • Tweens:
    • crosshair scaling and bullet scaling
  • TileMapLayer:
    • tileset creation
    • physics layers/masks per tile
    • auto-tiling mentioned, kept simple
  • Lighting/shaders:
    • directional + point lights
    • animate lights using AnimationPlayer/Tween
    • shader basics:
      • flashing drones using Visual Shader + shader parameters + tweens

Game 3 (3D space shooter)

  • 3D fundamentals:
    • meshes, materials, lights (required for visibility)
    • camera + environment/world config
  • Player movement:
    • CharacterBody3D velocity with Vector3 from 2D input
    • rotation + hover/bobbing using time + curve/sign logic
    • collision shape 3D + static obstacles
  • Projectiles:
    • Laser:
      • Area3D scene
      • move along Z using delta
      • tween scaling from small to visible
      • remove after threshold or via cleanup logic
    • Meteors:
      • spawned Area3D scenes via timer
      • randomized direction/scale/speed/rotation
      • collision fixes with CollisionShape + physics layer/mask filtering
      • hit flash via shader (progress uniform)
      • destruction after delay using wait/queue_free patterns
  • Obstacles:
    • spawn randomized visuals/transforms
    • collision ends the game
  • Final polish:
    • audio integration
    • player containment walls
    • meteor cleanup via VisibilityNotifier3D
    • floor shader/vertex displacement using a noise texture (vertex shader)

Speakers / sources featured

  • Speaker: Unspecified instructor/host (referred to as “I”; no name provided in subtitles)
  • Primary source / tool: Godot Engine (godotengine.org documentation and editor help)

Original video