Indholdsfortegnelse

Godot #1 - Basics


Godot #1 - fortsat

Interface


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:

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

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.

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

Typiske kandidater til egne scener

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 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.