====== 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. {{ :images:nodes.png?140|}} 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. {{:images:player_as_scene.png?200|}} 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) {{ :images:spite2d.png?200 | }} ---- ==== 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. ----