Video Game Design and Coding · PLECK lesson

PLECK lesson 74 · suggested week 15, day 4

Run a fresh-player route test

Objective. Use controls and environmental feedback rather than verbal coaching.

Godot Engine Standard desktop editor 4.7.2-stable, GDScript (Godot 4), Compatibility renderer. Headless Godot 4.7.2.stable.official.ed1daf0bf passed 106 assertions on the supplied scaffolds, including malformed JSON saves. Audio used the Dummy driver and a synthetic WAV, not a speaker. The visual editor, browser export, and signed-in submission were not tested. The desk still does not run a student's own upload.

About 55 minutes. The due date is chosen by a parent.

Difficulty curves, debugging, observation and a completed artifact

Suggested pace: Recall and predict 5 min; Read instruction and scaffold 12 min; Build or design the assigned artifact 25 min; Run acceptance tests 8 min; Explain and checkpoint 5 min.

Materials: Godot Standard 4.7.2 desktop editor (GDScript, Compatibility renderer), Local course folder and prior checkpoint, No paid assets or public account required.

Comes after VGC-L073.

Give a willing local tester the readme and start screen, not a live explanation of every obstacle. Observe whether they discover jump, recognize the checkpoint and understand the goal. If testing alone, take a break and follow the readme literally. Record nonidentifying observations and let the tester stop. Fix the most consequential issue first. A player failing a jump is not proof of a defect; look for repeated confusion, unreadable landing information or a mismatch between appearance and collision.

Worked example

For a repeated route test, keep controls and start position fixed. A table of attempts helps distinguish a consistently hard landing from a one-time input mistake. Scaffold C-CHECKPOINT — A safe checkpoint respawn Setup: Add this pattern to a separate Node2D level root with child Player using C-PLATFORM. Call set_checkpoint with a safe global position when a player reaches a checkpoint Area2D; call respawn when entering a fall zone. This code does not connect Area2D automatically; select the area body_entered signal in editor and call these methods from its handler after checking the player group. Respawn is deferred because a physics callback may be active. ```gdscript extends Node2D @onready var player: CharacterBody2D = $Player var checkpoint: Vector2 func _ready() -> void: checkpoint = player.global_position func set_checkpoint(safe_position: Vector2) -> void: checkpoint = safe_position func respawn() -> void: _apply_respawn.call_deferred() func _apply_respawn() -> void: player.global_position = checkpoint player.velocity = Vector2.ZERO ``` Scaffold C-PLATFORM — A gravity-and-jump platform player Setup: CharacterBody2D root Player, child CollisionShape2D RectangleShape2D size (24,32), no scale changes. Layer 1 mask 2. StaticBody2D floor layer 2 mask 1 with rectangular collider. Add Input Map move_left, move_right and jump bound to Space. Place player above floor, not intersecting it. Coordinates use positive y downward. Attach script to Player. ```gdscript extends CharacterBody2D @export var speed: float = 160.0 @export var gravity: float = 900.0 @export var jump_speed: float = 340.0 func _draw() -> void: draw_rect(Rect2(-12, -16, 24, 32), Color.SKY_BLUE) draw_line(Vector2(-8, -4), Vector2(8, -4), Color.BLACK, 2.0) func _physics_process(delta: float) -> void: velocity.x = Input.get_axis("move_left", "move_right") * speed if not is_on_floor(): velocity.y += gravity * delta if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = -jump_speed move_and_slide() ```

A safe checkpoint respawn

GDScript (Godot 4, not Scratch, Python, JavaScript or C#). Scaffold C-CHECKPOINT. Copy starts from this text. The desk does not run it.

Scene and node setup

Add this pattern to a separate Node2D level root with child Player using C-PLATFORM. Call set_checkpoint with a safe global position when a player reaches a checkpoint Area2D; call respawn when entering a fall zone. This code does not connect Area2D automatically; select the area body_entered signal in editor and call these methods from its handler after checking the player group. Respawn is deferred because a physics callback may be active.

extends Node2D
@onready var player: CharacterBody2D = $Player
var checkpoint: Vector2
func _ready() -> void:
    checkpoint = player.global_position
func set_checkpoint(safe_position: Vector2) -> void:
    checkpoint = safe_position
func respawn() -> void:
    _apply_respawn.call_deferred()
func _apply_respawn() -> void:
    player.global_position = checkpoint
    player.velocity = Vector2.ZERO

Checks to run in the editor

Native Godot 4.7.2.stable.official.ed1daf0bf headless compile and representative node-tree/runtime tests passed; see native-qa-results.json. Visual UI, audible output, exports and website submission still need separate checks.

A gravity-and-jump platform player

GDScript (Godot 4, not Scratch, Python, JavaScript or C#). Scaffold C-PLATFORM. Copy starts from this text. The desk does not run it.

Scene and node setup

CharacterBody2D root Player, child CollisionShape2D RectangleShape2D size (24,32), no scale changes. Layer 1 mask 2. StaticBody2D floor layer 2 mask 1 with rectangular collider. Add Input Map move_left, move_right and jump bound to Space. Place player above floor, not intersecting it. Coordinates use positive y downward. Attach script to Player.

extends CharacterBody2D
@export var speed: float = 160.0
@export var gravity: float = 900.0
@export var jump_speed: float = 340.0
func _draw() -> void:
    draw_rect(Rect2(-12, -16, 24, 32), Color.SKY_BLUE)
    draw_line(Vector2(-8, -4), Vector2(8, -4), Color.BLACK, 2.0)
func _physics_process(delta: float) -> void:
    velocity.x = Input.get_axis("move_left", "move_right") * speed
    if not is_on_floor():
        velocity.y += gravity * delta
    if Input.is_action_just_pressed("jump") and is_on_floor():
        velocity.y = -jump_speed
    move_and_slide()

Checks to run in the editor

Native Godot 4.7.2.stable.official.ed1daf0bf headless compile and representative node-tree/runtime tests passed; see native-qa-results.json. Visual UI, audible output, exports and website submission still need separate checks.

Run a fresh-player route test — evidence task

  1. 1. Run a five-minute local or structured self-test.
  2. 2. Record three observations and implement one high-impact fix.

Deliverable. Anonymous test sheet, issue prioritization and revised project.

Acceptance checks

Understanding question. Why rerun old tests after a layout-only fix?

Include a downloadable project ZIP with project.godot, .tscn, .gd and original asset files when code changes. A private, teacher-accessible download link to that ZIP is equivalent. Screenshots or a playthrough do not replace editable source.

If this is still shaky. Use the three-jump route and one checkpoint as the minimum game. Remove optional hazards until required tests pass. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.

Optional extra. Create a second optional route using the same movement code. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.

Name ____________________ Date ____________________