Ga naar hoofdinhoud

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

AssetPadBeschrijving
Backgroundassets/scenes/zevensprong.pngKruispunt achtergrond
Walkable Mapuser://walkable_map_zevensprong.pngLoopbaar gebied
Wegwijzerassets/objects/wegwijzer.pngWegwijzer bord
LabelsFont + stylingLocatie namen

Volgende