mirror of
https://github.com/Steffo99/nanogolf.git
synced 2024-11-21 15:44:21 +00:00
capitolo 2
This commit is contained in:
parent
a1053bba3c
commit
c9c9ccecfa
12 changed files with 241 additions and 8 deletions
|
@ -4,13 +4,80 @@
|
|||
|
||||
Fa uso di un suo linguaggio di programmazione personalizzato, chiamato [GDScript], che prende ispirazione da [Python] sia nella sintassi, sia nel paradigma di programmazione.
|
||||
|
||||
Dato che lo sviluppo di videogiochi si svolge in modo molto più sperimentale e iterativo di quello dei software tradizionali, presenta alcune scelte di design particolari atte a rendere il codice fortemente componibile e veloce da scrivere.
|
||||
Dato che lo sviluppo di videogiochi si svolge in modo molto più sperimentale e iterativo di quello dei software tradizionali, effettua alcune scelte di design particolari atte a rendere il codice fortemente componibile e veloce da scrivere.
|
||||
|
||||
Un'istanza di un software Godot consiste in una struttura ad albero, detta `SceneTree`, i cui nodi eterogenei hanno ciascuno delle proprie caratteristiche dette *proprietà*, un proprio comportamento detto *script*, delle implementazioni del pattern [observer]) dette *segnali*, e sono incapsulati in sottoalberi componibili detti *scene*.
|
||||
## Nodi
|
||||
|
||||
![Lo SceneTree di una istanza di Nanogolf in esecuzione.](img/scenetree.png)
|
||||
Un ***nodo*** è un'astrazione molto simile a quella di un'**oggetto** nella programmazione ad oggetti.
|
||||
|
||||
![Lo SceneTree di un livello non istanziato.](img/scenetree2.png)
|
||||
### Tipo
|
||||
|
||||
Ciascun nodo ha un ***tipo*** tratto da una gerarchia che ne determina le *proprietà* che il nodo stesso avrà, come:
|
||||
|
||||
- `Node`, un nodo generico senza proprietà, estendibile da altri tipi
|
||||
- `Node2D`, sempre un nodo generico, ma avente proprietà che ne descrivono la posizione in un *piano bidimensionale*, detto ***mondo***
|
||||
- `Sprite2D`, che disegna sul mondo la texture specificata come proprietà alla posizione del nodo
|
||||
- `PhysicsBody2D`, che effettua periodicamente una simulazione fisica basandosi sulle proprietà del nodo e ne aggiorna la posizione relativamente
|
||||
- `Camera2D`, che determina quale punto del piano bidimensionale deve essere visualizzato come centro della finestra
|
||||
- `Node3D`, un nodo generico come Node2D, ma che considera un *piano tridimensionale* come mondo
|
||||
- `MeshInstance3D`, che inserisce una mesh tridimensionale nel mondo
|
||||
- `Control`, un nodo generico usato per creare interfacce grafiche con proprietà che descrivono la *posizione nella finestra* che esso dovrà avere
|
||||
- `Label`, un nodo che scrive il testo specificato come proprietà alla posizione in cui si trova
|
||||
- `Button`, un nodo che disegna un bottone cliccabile alla posizione in cui si trova
|
||||
|
||||
I tipi corrispondono quindi bene o male al paradigma dell'**ereditarietà** della programmazione a oggetti.
|
||||
|
||||
![Parte dell'albero dei tipi.](img/typetree.png)
|
||||
|
||||
![Le proprietà messe a disposizione dallo Sprite2D che disegna la pallina.](img/proprieties.png)
|
||||
|
||||
### Figli
|
||||
|
||||
Ciascun nodo può avere dei ***figli***, le cui proprietà sono influenzate dalle proprie, ad esempio:
|
||||
|
||||
- un `Node2D` figlio di un'altro `Node2D` specificherà la propria posizione non relativa all'origine del mondo, ma *relativa alla posizione del genitore*
|
||||
- cinque `Label` figli di un `VBoxContainer` saranno allineati automaticamente *uno sotto l'altro*, mostrando così cinque righe di testo
|
||||
|
||||
Generalmente, i figli sono utilizzati per estendere funzionalità ai nodi in modo componibile; corrispondono quindi al paradigma della **composizione** della programmazione a oggetti.
|
||||
|
||||
![Nodo GolfLevel e i suoi figli.](img/scenetree2.png)
|
||||
|
||||
### Segnali
|
||||
|
||||
Oltre a proprietà e figli, ciascun nodo può avere dei ***segnali***, corrispondenti al pattern [observer] nella programmazione oggetti.
|
||||
|
||||
Il tipo di nodo determina quali segnali sono disponibili per esso.
|
||||
|
||||
Alcuni esempi di segnali:
|
||||
|
||||
- `Button` ha un segnale `pressed()`, che viene emesso quando il bottone viene premuto
|
||||
- `Area2D` ha un segnale `area_entered(body: RigidBody2D)`, che viene emesso quando un corpo fisico entra nell'area ricoperta dal nodo
|
||||
|
||||
Altri nodi possono connettersi ai segnali per effettuare dei comportamenti in risposta ad essi.
|
||||
|
||||
![I segnali messi a disposizione da GolfBall.](img/signals.png)
|
||||
|
||||
### Script
|
||||
|
||||
Il comportamento di ciascun nodo può essere esteso collegandoci uno ***script***, un file di codice in uno dei linguaggi supportati che viene valutato all'avvio del gioco.
|
||||
|
||||
I linuaggi supportati variano in base ai moduli installati dell'editor; per questo progetto, si è scelto per semplicità di utilizzare ***GDScript***, i cui file hanno l'estensione `.gd`.
|
||||
|
||||
Ciascuno script determina un'*estensione* ad uno dei tipi di nodo; come risultato, uno script può essere collegato solamente ai nodi possedenti il tipo che esso estende.
|
||||
|
||||
Gli script possono aggiungere al nodo sia delle loro proprietà, sia dei loro segnali.
|
||||
|
||||
![Uno script vuoto denominato GolfHole che estende Area2D.](img/script.png)
|
||||
|
||||
## Scene
|
||||
|
||||
Se un nodo è l'equivalente di un oggetto, una ***scena*** è l'equivalente di una *classe* nella programmazione ad oggetti.
|
||||
|
||||
Qualsiasi nodo può essere salvato assieme al suo script, a tutte le sue proprietà, tutti i suoi figli, e tutti i suoi segnali in un file `.tscn`, per poi essere *istanziato* in seguito, anche in più *copie*.
|
||||
|
||||
![Alcune delle scene di Nanogolf.](img/scenes.png)
|
||||
|
||||
## Vedi anche
|
||||
|
||||
Per più dettagli sui concetti chiave di Godot Engine, si suggerisce di fare riferimento alla [documentazione ufficiale] a riguardo, in particolare alla pagina [Overview of Godot's key concepts].
|
||||
|
||||
|
|
|
@ -1,5 +1 @@
|
|||
# Architettura
|
||||
|
||||
## Introduzione
|
||||
|
||||
Godot
|
BIN
docs/img/image.png
Normal file
BIN
docs/img/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
docs/img/scenes.png
Normal file
BIN
docs/img/scenes.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
34
docs/img/scenes.png.import
Normal file
34
docs/img/scenes.png.import
Normal file
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bnoojbv6vl2gd"
|
||||
path="res://.godot/imported/scenes.png-5dcc1c1fe4df86f0544fe8a401eaaf85.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/img/scenes.png"
|
||||
dest_files=["res://.godot/imported/scenes.png-5dcc1c1fe4df86f0544fe8a401eaaf85.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
34
docs/img/scenetree2.png.import
Normal file
34
docs/img/scenetree2.png.import
Normal file
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://wul2c2b38omr"
|
||||
path="res://.godot/imported/scenetree2.png-1d70052ada610c19616cb62989107c40.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/img/scenetree2.png"
|
||||
dest_files=["res://.godot/imported/scenetree2.png-1d70052ada610c19616cb62989107c40.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
BIN
docs/img/script.png
Normal file
BIN
docs/img/script.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.2 KiB |
34
docs/img/script.png.import
Normal file
34
docs/img/script.png.import
Normal file
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cvpgyv5dohoio"
|
||||
path="res://.godot/imported/script.png-af81849bd7f5da94d320ecce8b3083d5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/img/script.png"
|
||||
dest_files=["res://.godot/imported/script.png-af81849bd7f5da94d320ecce8b3083d5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
BIN
docs/img/signals.png
Normal file
BIN
docs/img/signals.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 61 KiB |
34
docs/img/signals.png.import
Normal file
34
docs/img/signals.png.import
Normal file
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bgyfhikis0sqm"
|
||||
path="res://.godot/imported/signals.png-952c1765bc0229c584d8c065afb01caf.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/img/signals.png"
|
||||
dest_files=["res://.godot/imported/signals.png-952c1765bc0229c584d8c065afb01caf.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
BIN
docs/img/typetree.png
Normal file
BIN
docs/img/typetree.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
34
docs/img/typetree.png.import
Normal file
34
docs/img/typetree.png.import
Normal file
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://ym8fcpvdie48"
|
||||
path="res://.godot/imported/typetree.png-880b276040f22ef31667526defde8447.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/img/typetree.png"
|
||||
dest_files=["res://.godot/imported/typetree.png-880b276040f22ef31667526defde8447.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
Loading…
Reference in a new issue