World Map (Zevensprong)
De wereld hub - kruispunt naar alle locaties.
Scene Structuur
Zevensprong (Control)
├── Background
│ └── BackgroundSprite (zevensprong achtergrond)
├── Character (Node2D)
│ └── [Character sprites]
├── ExitZones
│ ├── HomeZone (naar game.tscn)
│ ├── VillageZone (naar dorp)
│ ├── ForestZone (naar bos)
│ ├── FarmZone (naar boerderij)
│ └── ShopZone (naar winkels)
├── NPCs
│ └── [NPC spawns]
├── UI (CanvasLayer)
│ ├── LocationLabels
│ └── MiniMap
└── FadeRect
Bestanden
- Scene:
scenes/zevensprong.tscn - Script:
scripts/zevensprong.gd - Background:
assets/scenes/zevensprong.png
Exit Zones
Zone Definities
# Exit zones naar verschillende locaties
const ZONES = {
"home": {
"center": Vector2(200, 400),
"radius": 60.0,
"target": "res://scenes/game.tscn"
},
"village": {
"center": Vector2(900, 300),
"radius": 60.0,
"target": "res://scenes/village.tscn"
},
"forest": {
"center": Vector2(1000, 550),
"radius": 60.0,
"target": "res://scenes/forest.tscn"
},
"farm": {
"center": Vector2(500, 200),
"radius": 60.0,
"target": "res://scenes/farm.tscn"
}
}
Zone Detection
func _process(delta: float) -> void:
_handle_movement(delta)
_update_scale()
_check_exit_zones()
func _check_exit_zones() -> void:
if is_transitioning:
return
for zone_name in ZONES:
var zone = ZONES[zone_name]
var distance = character.position.distance_to(zone.center)
if distance < zone.radius:
_transition_to(zone_name, zone.target)
break
func _transition_to(zone_name: String, target_scene: String) -> void:
is_transitioning = true
is_moving = false
GameState.came_from_scene = "zevensprong"
var tween = create_tween()
tween.tween_property(fade_rect, "color:a", 1.0, 0.5)
tween.tween_callback(func():
get_tree().change_scene_to_file(target_scene)
)
Spawn Points
Entry Point per Herkomst
func _ready() -> void:
_load_character()
_load_walkable_map()
# Spawn based on where player came from
match GameState.came_from_scene:
"home":
character.position = Vector2(250, 400)
"village":
character.position = Vector2(850, 300)
"forest":
character.position = Vector2(950, 550)
"farm":
character.position = Vector2(550, 250)
_:
character.position = Vector2(576, 400) # Center default
GameState.came_from_scene = ""
_update_scale()
Location Labels
UI Indicators
@onready var labels = {
"home": $UI/LocationLabels/HomeLabel,
"village": $UI/LocationLabels/VillageLabel,
"forest": $UI/LocationLabels/ForestLabel,
"farm": $UI/LocationLabels/FarmLabel
}
func _update_labels() -> void:
for zone_name in ZONES:
var zone = ZONES[zone_name]
var distance = character.position.distance_to(zone.center)
# Show label when close
if distance < zone.radius * 2:
labels[zone_name].visible = true
labels[zone_name].modulate.a = 1.0 - (distance / (zone.radius * 2))
else:
labels[zone_name].visible = false
NPC Spawns
NPC Zones
# NPC spawn configuratie
const NPC_SPAWNS = {
"wegwijzer": {
"position": Vector2(576, 350),
"scene": "res://scenes/npcs/wegwijzer.tscn",
"dialog_id": "zevensprong_intro"
}
}
func _spawn_npcs() -> void:
for npc_id in NPC_SPAWNS:
var config = NPC_SPAWNS[npc_id]
var npc_scene = load(config.scene)
var npc = npc_scene.instantiate()
npc.position = config.position
npc.dialog_id = config.dialog_id
$NPCs.add_child(npc)
Visual Elements
Wegwijzer Bord
In het midden van de zevensprong staat een wegwijzerbord:
↑ Dorp
←──────────→
Bos │ Boerderij
│
↓
Thuis
Pad Sprites
Paden naar elke richting met unieke stijl:
- Thuis: Bloemen langs het pad
- Dorp: Stenen pad
- Bos: Mos en boomwortels
- Boerderij: Hooi en graanstengels
Perspective System
# Zevensprong heeft subtiele perspective
const MIN_Y: float = 200.0
const MAX_Y: float = 600.0
const MIN_SCALE: float = 0.025
const MAX_SCALE: float = 0.045
func _update_scale() -> void:
var t = (character.position.y - MIN_Y) / (MAX_Y - MIN_Y)
t = clamp(t, 0.0, 1.0)
var new_scale = lerp(MIN_SCALE, MAX_SCALE, t)
var flip = sign(character.scale.x) if character.scale.x != 0 else 1.0
character.scale = Vector2(new_scale * flip, new_scale)
Multiplayer
Andere Spelers Zien
func _setup_multiplayer() -> void:
if not client:
return
# Subscribe to players in zevensprong
client.subscribe([
"SELECT * FROM player_position WHERE scene = 'zevensprong'"
])
client.db.player_position.subscribe_to_inserts(&"Pos", _on_player_enter)
client.db.player_position.subscribe_to_updates(&"Pos", _on_player_move)
Assets Nodig
| Asset | Pad | Beschrijving |
|---|---|---|
| Background | assets/scenes/zevensprong.png | Kruispunt achtergrond |
| Walkable Map | user://walkable_map_zevensprong.png | Loopbaar gebied |
| Wegwijzer | assets/objects/wegwijzer.png | Wegwijzer bord |
| Labels | Font + styling | Locatie namen |