diff --git a/docs/2 - Premessa.md b/docs/2 - Premessa.md index 4c6f2e0..b41512d 100644 --- a/docs/2 - Premessa.md +++ b/docs/2 - Premessa.md @@ -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]. diff --git a/docs/3 - Architettura.md b/docs/3 - Architettura.md index 6008cde..5c03999 100644 --- a/docs/3 - Architettura.md +++ b/docs/3 - Architettura.md @@ -1,5 +1 @@ # Architettura - -## Introduzione - -Godot \ No newline at end of file diff --git a/docs/img/image.png b/docs/img/image.png new file mode 100644 index 0000000..1db758a Binary files /dev/null and b/docs/img/image.png differ diff --git a/docs/img/scenes.png b/docs/img/scenes.png new file mode 100644 index 0000000..48f1492 Binary files /dev/null and b/docs/img/scenes.png differ diff --git a/docs/img/scenes.png.import b/docs/img/scenes.png.import new file mode 100644 index 0000000..bcda563 --- /dev/null +++ b/docs/img/scenes.png.import @@ -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 diff --git a/docs/img/scenetree2.png.import b/docs/img/scenetree2.png.import new file mode 100644 index 0000000..9925f19 --- /dev/null +++ b/docs/img/scenetree2.png.import @@ -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 diff --git a/docs/img/script.png b/docs/img/script.png new file mode 100644 index 0000000..7d2daf4 Binary files /dev/null and b/docs/img/script.png differ diff --git a/docs/img/script.png.import b/docs/img/script.png.import new file mode 100644 index 0000000..a2c5171 --- /dev/null +++ b/docs/img/script.png.import @@ -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 diff --git a/docs/img/signals.png b/docs/img/signals.png new file mode 100644 index 0000000..f386f08 Binary files /dev/null and b/docs/img/signals.png differ diff --git a/docs/img/signals.png.import b/docs/img/signals.png.import new file mode 100644 index 0000000..fe32c6d --- /dev/null +++ b/docs/img/signals.png.import @@ -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 diff --git a/docs/img/typetree.png b/docs/img/typetree.png new file mode 100644 index 0000000..8c19a77 Binary files /dev/null and b/docs/img/typetree.png differ diff --git a/docs/img/typetree.png.import b/docs/img/typetree.png.import new file mode 100644 index 0000000..ab8d9dc --- /dev/null +++ b/docs/img/typetree.png.import @@ -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