Video Game Design and Coding · PLECK lesson
PLECK lesson 71 · suggested week 15, day 1
Measure a difficulty curve
Objective. Use attempts and recovery distance rather than intuition alone.
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-L070.
A difficulty curve describes how demands change through the level. Test each jump separately for five attempts, recording successes and the distance repeated after failure. A difficult jump near the start may be less frustrating than a moderate jump after a long unskippable section. Use your checkpoint intentionally to control repetition cost. Compare evidence from attempts with the teaching sequence: introduce, practice, combine. Do not assume every player’s results will match your own; report the limits of the sample.
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-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 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
- Player lands without sinking.
- Holding jump does not repeatedly jump in air.
- Do not multiply the whole velocity by delta before move_and_slide.
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.
Measure a difficulty curve — evidence task
- 1. Record five attempts on each of three jumps.
- 2. Revise one platform or checkpoint based on the pattern.
Deliverable. Difficulty table and before/after layout.
Acceptance checks
- VGC-L071-T1. The report contains fifteen attempts and actual outcomes.
- VGC-L071-T2. The revision targets a specific repeated problem.
Understanding question. Why measure retry distance as well as success rate?
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.
- Your first 2D game
Free public tutorial; no account; external asset download is optional, not used by this course.
· Opening this link does not submit the lesson.
Name ____________________ Date ____________________