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:
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.
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.
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/
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.
Gode navne gør koden lettere at læse og vedligeholde.
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 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.
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.
Navngiv også noder tydeligt:
Player Sprite2D CollisionShape2D HealthBar
I stedet for:
Node2D Node2D2 Sprite2D3
En scene kan oprettes én gang og derefter bruges mange steder i spillet.
Forestil dig, at du vil lave en fjende.
Opret en ny scene:
Enemy.tscn
Scenen kunne indeholde:
Enemy ├── Sprite2D └── CollisionShape2D
Gem herefter 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.
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.
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 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.
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)
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.