Pocket Orchard starter
These are the authored scaffold files as text. Copy them into Godot on the family computer. This page does not download a zip, extract an archive, or run the project. The scaffold is not a finished assignment.
README.md
# Pocket Orchard original course scaffold
Open project.godot in Godot Standard 4.7.2, Compatibility, then run project. WASD movement, three coins, two walls, completion and Restart. Add arrow alternatives in Input Map as lesson 13 teaches. This scaffold demonstrates the architecture; assignments require your own route, tuning, evidence and explanation.
All art uses original draw commands or polygons. No third-party asset download or account. Official Godot 4.7.2 native headless import, actual physics/collision, collection, completion and restart tests passed in an isolated project. See NATIVE-QA.md for commands/results. Visual editor layout, physical keyboard experience, audible output and optional exports remain untested.
Expected smoke tests: open main scene; move WASD; collide with both walls; collect exactly three items; score increments once; motion stops at completion; Restart restores player/coins/score. Keep your final project artifact separate from this starter.
coin.gd
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()
coin.tscn
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://coin.gd" id="1_coin"]
[sub_resource type="CircleShape2D" id="Circle_coin"]
radius = 10.0
[node name="Coin" type="Area2D"]
collision_layer = 4
collision_mask = 1
script = ExtResource("1_coin")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("Circle_coin")
player.gd
extends CharacterBody2D
@export var speed: float = 160.0
func _draw() -> void:
draw_circle(Vector2.ZERO, 14.0, Color.CORNFLOWER_BLUE)
draw_line(Vector2(-8, 0), Vector2(8, 0), Color.WHITE, 3.0)
func _physics_process(_delta: float) -> void:
velocity = Input.get_vector("move_left", "move_right", "move_up", "move_down") * speed
move_and_slide()
player.tscn
[gd_scene load_steps=3 format=3]
[ext_resource type="Script" path="res://player.gd" id="1_player"]
[sub_resource type="CircleShape2D" id="Circle_player"]
radius = 14.0
[node name="Player" type="CharacterBody2D" groups=["player"]]
collision_layer = 1
collision_mask = 2
script = ExtResource("1_player")
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("Circle_player")
project.godot
; Original Pleck course demonstration, editable Godot 4 source.
config_version=5
[application]
config/name="Pocket Orchard Course Scaffold"
run/main_scene="res://world.tscn"
config/features=PackedStringArray("4.7", "GL Compatibility")
[display]
window/size/viewport_width=640
window/size/viewport_height=360
[rendering]
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
environment/defaults/default_clear_color=Color(0.07,0.1,0.13,1)
[layer_names]
2d_physics/layer_1="Player"
2d_physics/layer_2="Walls"
2d_physics/layer_3="Pickups"
2d_physics/layer_4="Hazards"
[input]
move_left={
"deadzone": 0.2,
"events": [Object(InputEventKey,"physical_keycode":65)]
}
move_right={
"deadzone": 0.2,
"events": [Object(InputEventKey,"physical_keycode":68)]
}
move_up={
"deadzone": 0.2,
"events": [Object(InputEventKey,"physical_keycode":87)]
}
move_down={
"deadzone": 0.2,
"events": [Object(InputEventKey,"physical_keycode":83)]
}
wall.tscn
[gd_scene load_steps=2 format=3]
[sub_resource type="RectangleShape2D" id="Rect_wall"]
size = Vector2(32, 120)
[node name="Wall" type="StaticBody2D"]
collision_layer = 2
collision_mask = 1
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
shape = SubResource("Rect_wall")
[node name="Visual" type="Polygon2D" parent="."]
polygon = PackedVector2Array(-16,-60,16,-60,16,60,-16,60)
color = Color(0.28,0.52,0.3,1)
world.gd
extends Node2D
var score: int = 0
var playing: bool = true
@onready var score_label: Label = $HUD/Score
func _ready() -> void:
$HUD/Restart.pressed.connect(_restart)
for coin in [$Coin1, $Coin2, $Coin3]:
coin.collected.connect(_on_collected)
_refresh()
func _on_collected(points: int) -> void:
if not playing:
return
score += points
if score >= 3:
playing = false
$Player.set_physics_process(false)
_refresh()
func _refresh() -> void:
score_label.text = "Score: %d / 3" % score
if not playing:
score_label.text += " — Orchard complete!"
func _restart() -> void:
get_tree().reload_current_scene()
world.tscn
[gd_scene load_steps=5 format=3]
[ext_resource type="Script" path="res://world.gd" id="1_world"]
[ext_resource type="PackedScene" path="res://player.tscn" id="2_player"]
[ext_resource type="PackedScene" path="res://coin.tscn" id="3_coin"]
[ext_resource type="PackedScene" path="res://wall.tscn" id="4_wall"]
[node name="World" type="Node2D"]
script = ExtResource("1_world")
[node name="Player" parent="." instance=ExtResource("2_player")]
position = Vector2(80,180)
[node name="Coin1" parent="." instance=ExtResource("3_coin")]
position = Vector2(250,100)
[node name="Coin2" parent="." instance=ExtResource("3_coin")]
position = Vector2(380,220)
[node name="Coin3" parent="." instance=ExtResource("3_coin")]
position = Vector2(520,100)
[node name="Wall1" parent="." instance=ExtResource("4_wall")]
position = Vector2(180,220)
[node name="Wall2" parent="." instance=ExtResource("4_wall")]
position = Vector2(450,140)
[node name="HUD" type="CanvasLayer" parent="."]
[node name="Score" type="Label" parent="HUD"]
offset_left = 10.0
offset_top = 10.0
offset_right = 470.0
offset_bottom = 40.0
theme_override_font_sizes/font_size = 22
text = "Score: 0 / 3"
[node name="Restart" type="Button" parent="HUD"]
offset_left = 510.0
offset_top = 10.0
offset_right = 630.0
offset_bottom = 44.0
text = "Restart"
[node name="Controls" type="Label" parent="HUD"]
offset_left = 10.0
offset_top = 325.0
offset_right = 620.0
offset_bottom = 355.0
text = "WASD: move | Collect three gold circles | Restart: button"
