Week 19 packet
Student instructions, tasks, and checks. The answer key is not in this packet. Links stay as text. This page does not embed a clip or run a file.
# Week 19 — Art that teaches the rules
## VGC-L091 — Create an asset and rights inventory
**Objective:** Distinguish owning an asset from finding it online.
**Time:** 55 minutes
### Instruction
A search result is not permission to reuse a picture, song or character. Audit the midyear game and list every visual, sound, font and text asset. The simplest safe default is your own geometric art, original writing and no music. For outside material, record creator, exact source, license and required attribution before using it; if permission is unclear, replace it. Godot’s engine license is separate from the license of assets imported into your game. No lesson requires buying an asset pack.
### Worked example
An original safe-object icon could be a rounded triangle with a line marker. A dangerous-object icon could be a square with a cross, remaining distinct without hue.
### Assignment
1. Create an asset table with filename, creator, permission basis and credit text.
2. Replace one uncertain asset or explain why all current assets are original.
### Acceptance checks
- Every used asset has a documented permission basis.
- No “found on Google” entry is treated as a license.
**Submit:** Asset-rights inventory and cleaned project checkpoint.
**Question:** Does credit alone always grant permission to use copyrighted music?
**Support:** Use only circles, rectangles and text. Keep physics colliders unchanged while replacing a visual child. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.
**Optional extension:** Make a second visual theme without changing any gameplay script. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.
**Optional free reading:** [Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html), [Exporting for the Web](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html)
---
## VGC-L092 — Design consistent visual categories
**Objective:** Encode object roles with shape and contrast rather than color alone.
**Time:** 55 minutes
### Instruction
Visual language helps a player predict rules. Choose a rounded silhouette for safe pickups, a cross-marked square for hazards and a solid outlined rectangle for platforms. Keep the categories distinct when viewed without color. Use size and placement to make the goal prominent but avoid covering the player. Draw a legend and apply it consistently across one room. An object should not share the hazard symbol merely because the artist likes that shape if it is actually harmless.
### Worked example
An original safe-object icon could be a rounded triangle with a line marker. A dangerous-object icon could be a square with a cross, remaining distinct without hue.
### Assignment
1. Draw a four-category visual legend and apply it to your game.
2. Inspect a grayscale screenshot or hand-copy the scene using only black and white.
### Acceptance checks
- Safe, dangerous and solid objects remain distinguishable without hue.
- Legend agrees with actual game behavior.
**Submit:** Visual legend and before/after game screenshots.
**Question:** Why can color alone be an unreliable rule cue?
**Support:** Use only circles, rectangles and text. Keep physics colliders unchanged while replacing a visual child. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.
**Optional extension:** Make a second visual theme without changing any gameplay script. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.
**Optional free reading:** [Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html), [Exporting for the Web](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html)
---
## VGC-L093 — Make an original scalable icon
**Objective:** Create a simple SVG and import it as an image asset.
**Time:** 55 minutes
### Instruction
SVG is text describing vector shapes. In a plain-text editor create a file named seed_icon.svg containing <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><circle cx="16" cy="16" r="12" fill="#ffe080"/><path d="M10 16 L22 16" stroke="#202030" stroke-width="3"/></svg>. Save it inside the project and wait for Godot to import it. Assign it to a Sprite2D visual child. This image does not create a collider; keep the existing physics shape.
### Worked example
An original safe-object icon could be a rounded triangle with a line marker. A dangerous-object icon could be a square with a cross, remaining distinct without hue.
Scaffold C-PICKUP — An exactly-once pickup signal
Setup: Create Area2D root Coin, CollisionShape2D Circle radius 10. Layer 3 (bit value 4), mask layer 1 only. Monitoring on. Attach script and save Coin.tscn. In the Node > Groups editor add Player root to group player. Put a Coin instance and Player instance in World. Manager connects each Coin.collected to its score handler (see C-MANAGER). Signal wiring here is code-only: do not also connect body_entered in editor.
```gdscript
extends Area2D
signal collected(points: int)
@export var points: int = 1
var taken: bool = false
func _ready() -> void:
body_entered.connect(_on_body_entered)
func _draw() -> void:
draw_circle(Vector2.ZERO, 10.0, Color.GOLD)
draw_line(Vector2(-5, 0), Vector2(5, 0), Color.BLACK, 2.0)
func _on_body_entered(body: Node2D) -> void:
if taken or not body.is_in_group("player"):
return
taken = true
collected.emit(points)
queue_free()
```
### Assignment
1. Create the SVG icon and replace one pickup’s visual child with Sprite2D.
2. Make an original variation by changing a shape, not only its filename.
### Acceptance checks
- Icon imports and displays without missing-resource errors.
- Pickup collider and collection rule are unchanged.
**Submit:** Original SVG, project checkpoint and changed-shape note.
**Question:** What does importing SVG change about collision?
**Support:** Use only circles, rectangles and text. Keep physics colliders unchanged while replacing a visual child. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.
**Optional extension:** Make a second visual theme without changing any gameplay script. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.
**Optional free reading:** [Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html), [Exporting for the Web](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html)
---
## VGC-L094 — Animate feedback without changing physics
**Objective:** Use a Tween on a visual child and offer reduced motion.
**Time:** 55 minutes
### Instruction
A Tween smoothly changes a property over time. C-TWEEN gently pulses a pickup’s Visual Node2D scale. Put the script on the visual child, not the physics body, so the collision boundary stays constant. Repeated scale animation is not necessary for understanding the game; a reduced-motion choice should leave a steady symbol and text cue. Avoid rapid flashing or shaking. Test that the visual effect does not restart every frame by accidentally creating a new Tween inside _process.
### Worked example
An original safe-object icon could be a rounded triangle with a line marker. A dangerous-object icon could be a square with a cross, remaining distinct without hue.
Scaffold C-TWEEN — Animate only a visual child
Setup: Create Node2D root Visual under a stationary physics actor, attach this script to Visual and keep its parent collider unchanged. Draw a small circle. A Tween interpolates properties over seconds; this is a visual pulse, not a flashing effect. Use modest scale changes and disable it in a reduced-motion setting.
```gdscript
extends Node2D
var pulse: Tween
func _draw() -> void:
draw_circle(Vector2.ZERO, 10.0, Color.GOLD)
func _ready() -> void:
pulse = create_tween().set_loops()
pulse.tween_property(self, "scale", Vector2(1.08, 1.08), 0.6)
pulse.tween_property(self, "scale", Vector2.ONE, 0.6)
func stop_motion() -> void:
if pulse != null:
pulse.kill()
scale = Vector2.ONE
```
### Assignment
1. Add the gentle pulse to one visual child.
2. Implement a reduced-motion option that calls stop_motion or skips creating the Tween.
### Acceptance checks
- Collision size stays constant.
- Reduced motion removes the pulse while preserving the object’s meaning.
**Submit:** Animated/reduced-motion checkpoint and two-state test.
**Question:** Why not scale the entire physics actor for a decorative pulse?
**Support:** Use only circles, rectangles and text. Keep physics colliders unchanged while replacing a visual child. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.
**Optional extension:** Make a second visual theme without changing any gameplay script. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.
**Optional free reading:** [Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html), [Exporting for the Web](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html)
---
## VGC-L095 — Organize visual assets for maintainability
**Objective:** Use stable paths and a scene-based visual wrapper.
**Time:** 55 minutes
### Instruction
Organized assets reduce broken references. Put original icons under art and reusable visual scenes under scenes/visuals. Rename or move imported resources through the Godot FileSystem dock when possible so references update. Keep one visual wrapper scene for a shared pickup appearance. If every instance points to it, a shape correction can be made once. Restore-test the project after reorganizing; a game that runs only because an old cache remembers a moved file is not a reliable artifact.
### Worked example
An original safe-object icon could be a rounded triangle with a line marker. A dangerous-object icon could be a square with a cross, remaining distinct without hue.
Scaffold C-DRAW — Draw an original geometric actor
Setup: Create Node2D root Actor. Attach actor.gd. Save Actor.tscn. A draw command uses coordinates relative to Actor. Set its Position to (200,150) in the Inspector. Change the blue color or white marker to make original art. No imported artwork is needed.
```gdscript
extends Node2D
func _draw() -> void:
draw_circle(Vector2.ZERO, 14.0, Color(0.15, 0.5, 0.9))
draw_line(Vector2(-8, 0), Vector2(8, 0), Color.WHITE, 3.0)
```
### Assignment
1. Organize original visual assets and one shared visual scene.
2. Restore the project ZIP in a clean folder and run it.
### Acceptance checks
- No missing texture or scene path appears.
- Shared appearance changes propagate to all intended instances.
**Submit:** Organized project artifact and path audit.
**Question:** Why test a clean restored copy after moving assets?
**Support:** Use only circles, rectangles and text. Keep physics colliders unchanged while replacing a visual child. Start with the first assigned task and re-run its acceptance test before adding the remaining feature.
**Optional extension:** Make a second visual theme without changing any gameplay script. Document one changed parameter, your prediction, and the observed effect; optional, not required for completion.
**Optional free reading:** [Your first 2D game](https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html), [Exporting for the Web](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_web.html)
---
