5. Building Placement
Implementeer een building placement systeem met validatie en auto-rotation
Overzicht
In dit hoofdstuk leer je:
BuildingPlacer script maken
Click-to-place buildings implementeren
Placement validatie (alleen op grass)
Buildings auto-roteren naar aangrenzende wegen
GridMap orientation system gebruiken
Placement Rules
Een building kan alleen geplaatst worden als:
De cell bevat grass (tile ID 7)
Er is minimaal één aangrenzende weg (tile ID 14)
Als beide voorwaarden kloppen, roteert het building automatisch om naar de weg te wijzen!
Dit creëert een natuurlijke stad layout waar buildings altijd toegankelijk zijn via wegen.
BuildingPlacer Setup
Maak de basis node en het script voor het plaatsen van gebouwen.
Node aanmaken:
Open scenes/main.tscn
Voeg een Node3D child toe aan Main en noem deze
BuildingPlacer
Voeg een script toe aan de nieuwe BuildingPlacer Node
Nieuwe Godot-specifieke elementen:
GridMap.SetCellItem()- Plaatst een tile op een specifieke cell met rotatieGridMap.GetCellItem()- Leest welke tile er op een cell staatGridMap.GetOrthogonalIndexFromBasis()- Converteert een 3D rotatie naar een GridMap orientation index (0-23)
Open
scripts/BuildingPlacer.csVoeg de using directive en class declaratie toe:
Voeg exports toe voor referenties naar de Raycaster en GridMap. Deze heb je nodig om te detecteren waar de muis is en om tiles te plaatsen.
Voeg exports toe voor de tile IDs die je wilt herkennen. Deze IDs verwijzen naar de grass en road tiles in je MeshLibrary.
Voeg een property toe voor het geselecteerde building ID. Later kun je dit gebruiken voor een building selector UI.
Validatie Logica Implementeren
Implementeer de logica om te bepalen of een building geplaatst kan worden en in welke richting deze moet staan.
Voeg een lege private method toe
FindAdjacentRoad. Deze method checkt de 4 buren (Noord, Oost, Zuid, West) en geeft de juiste rotatie terug als er een weg is. Het return typeint?betekent dat de methodnullkan teruggeven als er geen weg is.
Definieer een array met de 4 aangrenzende cells.
Vector3I.Backis zuid,Vector3I.Rightis oost, etc. Dit zijn de 4 buren in GridMap coordinaten.
Definieer de bijbehorende rotaties in graden. Als er een weg aan de zuidkant is (index 0), moet het building 0° roteren (naar het zuiden wijzen). Bij oost 90°, noord 180°, west 270°.
Voeg een lege for-loop toe om door alle buren te itereren:
Check voor elke buur of het een weg is.
GetCellItem()geeft het tile ID terug, of -1 als de cell leeg is.
Bereken de GridMap orientation index als er een weg gevonden is. Maak eerst een rotatie
Basis, converteer deze dan naar een GridMap index (0-23) metGetOrthogonalIndexFromBasis(). GridMap gebruikt indices 0-23 voor rotaties.GetOrthogonalIndexFromBasisconverteert een normale 3D rotatie naar de juiste index voor de GridMap.
Return
nullals er geen weg gevonden is na de loop:
Voeg een lege public method
CanBuildtoe. Deze method checkt of er gebouwd mag worden op de huidige muispositie.
Haal de cell onder de muis op. Return
falseals er geen cell is (muis buiten de GridMap).
Check of de cell gras is. Return
falseals het geen gras is (bijvoorbeeld een weg of ander building).
Check of er een aangrenzende weg is. Return het resultaat van
FindAdjacentRoad()-trueals er een weg is,falseals er geen weg is.
Building Placement Implementeren
Implementeer de daadwerkelijke plaatsing en input handling.
Nieuwe Godot-specifieke elementen:
_Input()- Ontvangt alle input events (toetsenbord, muis, etc.)IsActionPressed()- Checkt of een input action net is ingedrukt (één keer per klik)
Voeg een lege public method
Buildtoe. Deze method plaatst het building op de huidige muispositie.
Haal de cell onder de muis op. Return als er geen cell is.
Bereken de rotatie op basis van de aangrenzende weg. Return als er geen weg is (dit zou niet moeten gebeuren als
CanBuild()eerst aangeroepen is).
Plaats het gebouw met
SetCellItem(). Deze method accepteert de cell positie, het tile ID, en de orientation index.
Voeg een lege
_Input()method toe. Deze ontvangt alle input events van Godot.
Check of de "build" action is ingedrukt (linkermuisknop):
Valideer met
CanBuild()en roepBuild()aan als het mag:
Configuratie en Testen
Koppelen in Editor:
Selecteer de BuildingPlacer node
Sleep het script naar het Script slot
Belangrijk: Sleep de GridMapRaycaster en GridMap nodes naar de export velden!
Testen:
Run de game (F5)
Probeer een gebouw te plaatsen naast een weg (op gras) -> Succes!
Probeer te plaatsen zonder weg -> Geen actie
Probeer te plaatsen op de weg -> Geen actie
Merk op dat het gebouw automatisch naar de weg draait.
Samenvatting
Je hebt nu een slim placement systeem!
Kernpunten:
Validatie zorgt dat gebouwen logisch geplaatst worden.
FindAdjacentRoadbepaalt dynamisch de rotatie.De GridMap API (
SetCellItem,GetCellItem) beheert de grid state.Buildings roteren automatisch naar aangrenzende wegen.
Input handling met
_Input()voor click-to-place interactie.
Volledig script
Laatst bijgewerkt