9. Money System
Bouw een economy systeem met MoneyManager autoload en UI display
Overzicht
In dit hoofdstuk leer je:
MoneyManager.cs autoload singleton maken
Signal-based architecture (MoneyChanged signal)
TrySpend() pattern voor purchases
AddMoney() voor income
MoneyDisplay.cs Label component
Signal subscriptions in UI
Building costs via BasePlacer.BuildCost
Wat is een Economy System?
Een economy system geeft gameplay depth door resource management:
Spelers besteden geld aan infrastructure (buildings, roads)
Cars genereren geld door trips te voltooien (hoofdstuk 11)
Balans: genoeg infrastructuur bouwen om trips mogelijk te maken, maar niet te veel uitgeven
Singleton pattern: Godot's AutoLoad system maakt MoneyManager globally toegankelijk via /root/MoneyManager. Elke script kan geld toevoegen/uitgeven zonder referenties door te geven.
MoneyManager script aanmaken
Maak een singleton die het geld beheert.
Nieuwe Godot-specifieke elementen:
[Signal]- Attribuut om C# events als Godot signals te exposeren[Signal]attribuut vertelt Godot: "dit is een signal"delegate void NaamEventHandler(params)= C# event typeConvention: naam eindigt met
EventHandlerSignal naam wordt automatisch
MoneyChanged(zonder "EventHandler" suffix)
delegate- C# event type definitieEmitSignal()- Fired een signal naar alle subscribers
Maak een nieuw script
scripts/MoneyManager.csMaak de class aan die inherit van Node:
Voeg een export toe voor starting money:
Voeg een property toe voor current money. Deze heeft een private setter (alleen MoneyManager kan het wijzigen):
Definieer een signal voor money changes:
Sla het script op
_Ready implementeren
Initialiseer het startbedrag en fire een initiële signal.
Voeg een lege
_Ready()method toe:
Zet CurrentMoney op de starting value:
Fire de MoneyChanged signal:
SignalName:
SignalName.MoneyChanged= compile-time veilige signal naamGodot genereert dit automatisch van de delegate definitie
Voorkomt typos ("MoneyChanged" vs "moneyChanged")
Sla het script op
CanAfford implementeren
Maak een helper method om te checken of de speler iets kan betalen. We gebruiken hiervoor een expression-body, gelijkaardig als je in Javascript of Typescript kan doen.
Korte syntax voor simple returns
=> expressionis hetzelfde als{ return expression; }
Voeg een
CanAfford()method toe:
Sla het script op
TrySpend implementeren
Maak een method om geld uit te geven met validation.
Voeg een lege
TrySpend()method toe:
Check of de speler het kan betalen:
Print een waarschuwing bij onvoldoende geld:
Trek het bedrag af:
Fire het signal:
Debug print en return success:
Sla het script op
AddMoney implementeren
Maak een method om geld toe te voegen (car revenue).
Voeg een lege
AddMoney()method toe:
Voeg het bedrag toe:
Fire de signal:
Debug print:
Sla het script op
MoneyManager als AutoLoad toevoegen
Configureer MoneyManager als singleton.
Open Project → Project Settings
Ga naar de Globals tab
Klik op de AutoLoad sectie
In het Path veld:
Klik het folder icoontje
Navigeer naar
scripts/MoneyManager.csSelecteer het script
Node Name:
MoneyManager(moet exact zo heten!)Klik Add
MoneyManager verschijnt nu in de AutoLoad lijst
Klik Close
Wat doet AutoLoad?
Godot instantieert MoneyManager automatisch bij game start
Toegankelijk via
/root/MoneyManagervanuit elke scriptBlijft bestaan tussen scene changes
BasePlacer updaten met kosten
Voeg building costs toe aan de BasePlacer, zodat de RoadPlacer en BuildingPlacer dat ook automatisch bevatten.
Open
scripts/BasePlacer.csVoeg een cost export toe bovenaan:
BuildingPlacer Build() method updaten
Nu update je de Build() method, zodat je de buildingCost ook gebruikt.
Open
scripts/BuildingPlacer.csUpdate de
Build()method om geld te checken en uit te geven:
Flow:
Get cell under mouse
Get MoneyManager singleton
Try to spend money (returns false als onvoldoende)
Early return als niet genoeg geld
Place building alleen als payment succesvol
Sla het script op
RoadPlacer updaten met kosten
Voeg road costs toe aan de RoadPlacer.
Open
scripts/RoadPlacer.csVoeg een cost export toe na de RoadNavigation export:
Update de
Build()method:
Sla het script op
MoneyDisplay UI toevoegen
Voeg een label toe aan de Main scene voor de money display.
Open
scenes/Main.tscnSelecteer BuildingSelector in de Scene Tree (de Control node)
Voeg een Label node toe als child van BuildingSelector
Hernoem naar
MoneyDisplaySelecteer MoneyDisplay
In de Inspector → Script: attach
scripts/MoneyDisplay.csIn de Inspector → Label sectie:
Text: "1000$" (tijdelijke placeholder)
In de Inspector → Control → Layout sectie:
Layout Preset: kies Top Right (of custom positioneer rechtsboven)
In de Inspector → Label → Theme Overrides → Font Sizes:
Font Size: 32 (groot en zichtbaar)
In de Inspector → Label → Theme Overrides → Colors:
Font Color: geel of groen (opvallend contrast)
Sla de scene op (Ctrl+S)
MoneyDisplay script aanmaken
Maak een UI label die het geldbedrag toont.
Voeg een nieuw script toe aan de MoneyDisplay node
Maak de class aan die inherit van Label:
Voeg een field toe voor de MoneyManager reference:
Sla het script op
_Ready implementeren (MoneyDisplay)
Subscribe naar de MoneyChanged signal.
Voeg een lege
_Ready()method toe:
Haal de MoneyManager singleton op:
Subscribe naar de MoneyChanged signal:
Signal subscription:
C# events gebruiken
+=operatorOnMoneyChanged= callback method (maken we hierna)Automatically aangeroepen wanneer signal fired
Zet de initiële value:
Waarom manually aanroepen?
Signal fired alleen bij changes
We willen de initial value ook tonen
Roep OnMoneyChanged handmatig aan met StartingMoney
Sla het script op
OnMoneyChanged implementeren
Maak een callback die de label text update.
Voeg een lege
OnMoneyChanged()method toe:
Update de label text:
Label.Text:
Property die de displayed text bepaalt
String interpolation:
$"€{newAmount}"= "€1000"
Sla het script op
Testen
Test het money systeem.
Start het spel (F5)
Check of de MoneyDisplay "€1000" toont (starting money)
Plaats een building:
Money moet decrease met 100
Display moet updaten naar "€900"
Console moet "Spent 100. Remaining: 900" printen
Plaats enkele roads:
Elke road kost 50
Display moet updaten
Test edge case - probeer te bouwen zonder geld:
Spend all money door buildings/roads te plaatsen
Probeer nog een building te plaatsen
Console: "Not enough money!" bericht
Display verandert niet (geen purchase)
Werkt alles? Sluit het spel (F8)
Veelgemaakte fouten
MoneyManager niet gevonden: AutoLoad is niet correct ingesteld. Check Project Settings → Globals → AutoLoad en verify dat MoneyManager daar staat met exact die naam.
MoneyDisplay toont niks: Script is niet attached OF Label.Text wordt niet geset. Check Inspector script attachment en debug print in OnMoneyChanged.
Signal fired maar callback niet aangeroepen: Event handler syntax verkeerd (
=ipv+=) OF method signature komt niet overeen (moetvoid MethodName(int)zijn).Money display niet readable: Font size te klein OF kleur contrast te laag. Maak groter (32+) en gebruik bright color (geel/groen/wit).
BuildingPlacer/RoadPlacer cost werkt niet: Check of de
TrySpend()call VOORSetCellItem()staat. Early return moet gebeuren als niet genoeg geld.
Volledige scripts
Laatst bijgewerkt