Indholdsfortegnelse
Godot #1 - Basics
- Godot interface
- Node typer & egenskaber
- StaticBody2D
- RidgidBody2D
- CharacterBody2D + movement script
- Area2D
- Collisioner
- Signals (OnBodyEntered)
- KillZone
Godot #1 - fortsat
- Node internals
- position
- rotation
- Ready, Process & PhysicsProcess
- GetNode<>
- Timers (Som et signal)
Interface
- Scene Tree (viser de Nodes som scenen består af)
- Filsystem (hvilke filer består vores projekt/spil af)
- Main window
- Inspector (Viser egenskaber for et valgte node)
- AssetLib
Scenes & Nodes
Opbygning af et spil i Godot består af Scenes. En Scene består af en mængde Objekter arrangeret i en træ struktur. Et objekt i træet kaldes også for en Node, eller på dansk en Knude.
Når vi starter et projekt i Godot skal vi først angive typen af den Node som udgør roden af træet.
Som udgangspunkt kan vi vælge mellem:
- Node2D
- Node3D
- User Interface
- Other Node
Jeg ønsker at lave et 2D spil (top-down), og vælger derfor Node2D.
En Node med navnet Node2D udgør nu roden af træet. Omdøb denne til et sigende navn f.eks 'World'.
Gem din scene ved 'CTRL+S', og opret en folder 'scenes' hvori du kan gemme alle din fremtidige Scenes.
Godot har defineret en række Objekter (Nodes) med forskellige egenskaber som vi kan anvende i vores projekter.
Til det formål at have et Objekt vi kan flytte rundt på i vores spil kan vi anvende en 'CharaterBody2D' Node.
Marker din root Node, og klik '+' tegnet øverst til venstre. Nu kan du søge på 'Char' .. og alle præ-definerede Nodes der starter med 'Char' vil blive vist. Tilføj nu 'CharacterBody2D', og giv efterfølgende denne Node et sigende navn f.eks. Player.
Som en Scene træ vokser i størrelse og kompleksitet kan det være en fordel at opdele i mindre træer. Derfor vil vi, allerede nu gemme Player Node som sin egen Scene træ. Højre-klick Player vælg 'Save branch as scene'. Du vil nu se et lille 'Clip-board' icon ved siden af din Player.
Klik 'Clip-board' ikon for at få vist Player scene i sit eget vindue.
Projektstruktur og navngivning
Når et Godot-projekt vokser, bliver det hurtigt svært at holde styr på filer, scener og scripts. Derfor er det vigtigt at etablere en god struktur fra starten. En velorganiseret projektstruktur gør projektet nemmere at vedligeholde og lettere at arbejde sammen om.
Anbefalet mappestruktur
En typisk struktur kan se sådan ud:
res:// │ ├── scenes/ │ ├── player/ │ │ ├── Player.tscn │ │ └── Player.cs │ ├── enemies/ │ └── levels/ ├── scripts/ ├── assets/ │ ├── fonts/ │ ├── music/ │ ├── sprites/ │ ├── sounds/ │ └── fonts/ └── data/
Generelle principper
- Saml relaterede filer i samme mappe.
- En scene og dens tilhørende script bør ofte ligge sammen.
- Undgå at placere alle filer i projektroden.
- Brug mapper til at gruppere funktionalitet frem for filtyper.
Godt eksempel
player/ ├── Player.tscn ├── Player.gd ├── player_idle.png └── player_run.png
Mindre godt eksempel
sprites/ scripts/ scenes/
Her bliver det hurtigt svært at finde alle filer, der hører til spilleren.
Navngivning
Gode navne gør koden lettere at læse og vedligeholde.
Scener
Brug navne der beskriver scenens formål:
Player.tscn Enemy.tscn MainMenu.tscn Level01.tscn
Undgå navne som:
Test.tscn NyScene.tscn MinTing.tscn
Scripts
Scripts bør som hovedregel have samme navn som scenen:
Player.tscn Player.gd
Enemy.tscn Enemy.gd
Det gør det nemt at se sammenhængen mellem scene og kode.
Variabler
Brug beskrivende navne:
var score = 0 var player_health = 100 var movement_speed = 200
Undgå:
var x = 0 var tal = 100 var ting = 200
Medmindre variablen kun bruges meget lokalt.
Noder
Navngiv også noder tydeligt:
Player Sprite2D CollisionShape2D HealthBar
I stedet for:
Node2D Node2D2 Sprite2D3
Genbrug af scener
En scene kan oprettes én gang og derefter bruges mange steder i spillet.
Opret en separat scene
Forestil dig, at du vil lave en fjende.
Opret en ny scene:
Enemy.tscn
Scenen kunne indeholde:
Enemy ├── Sprite2D └── CollisionShape2D
Gem herefter scenen.
Instantiér scenen
Når en scene er gemt, kan den bruges i andre scener.
var enemy_scene = preload("res://scenes/enemies/Enemy.tscn")
func _ready():
var enemy = enemy_scene.instantiate()
add_child(enemy)
Godot opretter nu en ny instans af fjenden.
Fordele ved genbrugelige scener
- Én scene kan bruges mange steder.
- Ændringer i den oprindelige scene slår igennem alle steder, hvor den bruges.
- Mindre kopiering af arbejde.
- Mere overskuelig og modulær projektstruktur.
Typiske kandidater til egne scener
- Spilleren
- Fjender
- Projektiler
- Kister og powerups
- UI-elementer
- Platforme og forhindringer
Hvis du forventer at bruge et objekt mere end én gang, bør det sandsynligvis være sin egen scene.
Godot-spil bygges ofte op af mange små, genbrugelige scener, som sammensættes til større systemer. På samme måde som Unity bruger Prefabs, bruger Godot genbrugelige scener som byggeklodser i projektet.
Node egenskaber
Enhver node har nogle egenskaber. Når du markerer en Node i Scene træet, kan du ses egenskaber for denne node i Inspector vinduet.
Vores 'Player' som er en CharacterBody2D Node har bl.a. nedenstående egenskaber:
- Transform
- Position X,Y,Z
- Rotation
- Scale
- CollisionObject2D
- CanvasItem
Transform er den egenskab der omhandler den 'fysiske' placering af objektet i vores spil.
Under Transform, kan vi styre positionen i X,Y og Z retning (Z retning er gemt, når vi laver 2D spil)
Rotation er objektets rotation omkring Z aksen.
Disse egenskaber kan læse fra og skrive til.
Sprite
Player mangler en grafisk repræsentation af sig i vores spil. Dette kan vi tilføje ved anvende en Sprite.
Markér Player, højre-klik og vælg 'add child node'. Søg efter 'Sprite2D' og tilføj denne. Markerer vi Sprite2D kan se at denne Node også har en række egenskaber. (Se nedenstående billede)
Collision
Tilføj en 'CollisionShape2D' Node til Player. ( CTRL-A )
Bemærk advarsels trekanten ved CollisionShape2D. Dette indikere at vi endnu ikke har angivet det område der skal generere en kollision.



