Condividi su:

Premessa

Questo articolo nasce dagli appunti del mio “diario di bordo” riguardo la mia più nuova e recente avventura nel mondo dei Game Engine e di conseguenza ne erediterà la scrittura caratteristica personale. In fin dei conti penso che almeno una volta nella vita di tutti gli sviluppatori è nata quella voglia di creare e plasmare forme di intrattenimento con il loro codice, e non soltanto di muovere qualche finestra/container e riempirlo di campi, pulsanti e tanta altra roba noiosa.

L’articolo si compone di due macro-parti:

  • Introduzione al Game Engine GODOT
  • Esempio pratico della realizzazione di un gioco 2D
  •  

Non peccherò di superbia, poiché essendo un novello dell’ambiente il mio codice e le mie tecniche potrebbero far storcere il naso ai più skillati in materia. Ma per me il tutto funziona come dovrebbe, il codice è leggibile e soprattutto adoro il pensiero del “less is more”.

 Insomma, le porzioni di codice che incontreremo più avanti sono state fatte DA e PER uno sviluppatore che muove i primi passi con questo Game Engine, rimanendo tuttavia una solida base per studi ed espansioni personali.

Introducing GODOT

Le circostanze del mio avvicinamento a GODOT sono al quanto bizzare

Da avido utilizzatore della piattaforma/forum Reddit, sono solito frequentare categorie tecniche relative alla programmazione, all’hardware e assemblaggio di PC ed al PC Gaming in generale.

Il caldo insopportabile di quest’anno (2022) legato alla cappa costante tipica romana hanno in quel periodo fatto nuovamente tornare alla mia mente la voglia di approcciarmi per una volta e seriamente ad un motore di sviluppo di giochi.

Ed ecco il punto di svolta, nella categoria dello sviluppo gaming di Reddit leggo in alcuni post di un nuovo nome, a me completamente sconosciuto: GODOT. Incuriosito decido di andare a dare uno sguardo alla sua community, la cui attività è spesso e volentieri un buon indice di prima valutazione per qualsiasi prodotto informatico/framework.

Ebbene, mentre i colossi competitor nel mondo del Game Engine (Unreal Engine e Unity) rilasciavano le loro nuove major release con features spaziali e le rispettive community portavano avanti discussioni su possibili miglioramenti, nuove strategie, fix per le performance…la community di GODOT sfornava nell’80%+ dei propri post questo:

“Godette”. La mia prima reazione è stata ovviamente che “ogni giorno ci allontaniamo sempre di più da Dio”. Siamo dunque SICURAMENTE davanti ad un prodotto che o è estremamente nuovo ed è ancora alla ricerca di una sua identità/logo/mascotte oppure che non ha al momento problemi tecnici più seri di cui dover discutere…

Nonostante tutto rimango colpito da una sua tanto proclamata caratteristica: questo motore è LIGHT, leggero, performante, anche su macchine meno recenti.  Vi basti pensare che l’intero motore è racchiuso in unico download da ~70MB. Ed io che in quel momento a casa avevo soltanto tra le mani un vecchio portatile i3/4GB RAM del 2011 ho voluto mettere alla prova questa loro tanto decantata feature.

Mentre il mio povero laptop crashava per surriscaldamento al solo sussurro delle parole Unreal e Unity, ecco che scarico, lancio l’eseguibile ed avvio GODOT nel giro di pochi secondi, al limite del miracolo. Riuscendo a sopportare una prima ora di smanettamenti caotici senza crash, decido che questo prodigioso game engine sarebbe stato mio compagno per questa mia prima impresa.

Breve Panoramica

  • Prima release pubblica nel 2014
  • Autori Argentini Juan Linietsky e Ariel Manzur
  • Free (MIT License)
  • Open Source (https://github.com/godotengine/godot)
  • Cross Platform (Windows, Linux, macOS, …)
  • 2D/3D/VR e Cross Platform (Desktop, Mobile, Web)
  • Ultima Versione stabile 3.5 (di Agosto 2022)

SA questo punto che son state fatte le prime presentazioni mi piace fare un gioco di persuasione inverso…Sarebbe semplice entrare nel dettaglio del cosa rende GODOT unico e migliore rispetto ai competitors ma questa volta preferire cominciare dal punto di vista contrario.

  • La maggior parte delle offerte di lavoro si basano ancora su Unity e Unreal Engine

  • Impossibilità di esportare per le piattaforme console, o almeno non senza cacciar fuori qualche soldo :'(

  • Lo store degli assets in GODOT offre soltanto elementi gratuiti
    (a discapito della loro qualità)

  • Nei giochi 3D le performance non sono delle migliori…

  • E’ un motore “giovane”, quindi con minori risorse e materiale online da cui attingere come riferimento/studio

Insomma, uno scenario abbastanza pesante e negativo, ma se ci pensate bene qualunque framework ed engine ha pur iniziato da qualche parte, ed in prospettiva, le feature sviluppate e a disposizione su GODOT nel giro di 8 anni dalla sua prima release sono di gran lunga superiori per numero e qualità a quelle dei due big brothers UE e Unity.

Se ancora non vi ho scoraggiato direi possiamo proseguire con una lista più rosea e positiva.

  • Ripeto: è FREE, e non prende commissioni sui giochi realizzati
  • LIGHT: con i suoi 70MB di eseguibile, GODOT probabilmente potrebbe girare anche sul forno a microonde di casa (assieme a Doom ovviamente)
  • Open Source con un attività esponenzialmente crescente
  • Beginner-friendly (sia grazie all’UI intuitiva che alla semplicità del suo linguaggio GDScript
  • Ottima documentazione (Link)
  • Alta riusabilità degli elementi/codice

Tornando a noi ho deciso di non includere un’altra feature tanto decantata in questa lista, ovvero la possibilità di usare il C# al posto del proprietario GDScript. Il motivo è semplice la versione 3 è stata la prima a supportare anche il C#, sicuramente con una base di sviluppatori già affermata nel mondo professionale, ma la sua implementazione nell’engine è a mio parere ancora acerba ed incompleta.

Ma non disperate, la sua finalizzazione in GODOT avverrà con enorme probabilità con il rilascio della versione 4, già in sviluppo parallelo alle 3 da quasi due anni. Tuttavia, trascorse queste prime settimane con l’engine posso affermare di non essermi trovato affatto male con il linguaggio proprietario GDScript: con una sintassi simile a Python, parliamo di un linguaggio di alto livello semplice ed immediato, ottimizzato per il motore. Mentre nei miei scarsi tentativi con C# mi son presto reso conto che il micromanagement necessario per una corretta gestione delle risorse uccideva completamente il mio tempo e la perfomance dei miei prodotti.

Altra feature che ho volontariamente omesso nella lista dei vantaggi è la possibilità di sviluppare usando la modalità Visual Scripting, già presente su Unreal Engine (Flow Control).

Diciamo semplicemente che questa roba non fa per me, o comunque immagino che qualsiasi sviluppatore anche junior potrebbe scrivere e mantenere del codice in GODOT molto meglio di quanto prodotto dallo strumento di Visual Scripting.

Feature simpatica, sicuramente una risposta diretta al Flow Control di UE e rivolta ad un pubblico che ancora si deve affacciare al mondo della programmazione, ma ci vuole davvero poco per rendersi indipendenti ed autonomi, passando direttamente all’editor classico di codice.

Struttura a Nodi & Scene

Anche un neofita come me apprezzerà l’altissima riusabilità e gestione delle risorse dovute all’ingegnoso sistema a nodi e scene di GODOT:

  • In GODOT un gioco può essere visto come un ALBERO di SCENE

  • Ed ogni SCENA è paragonabile ad un ALBERO di NODI

  • I NODI sono l’unità fondamentale e più piccola dei nostri giochi

  • Ci sono tantissimi NODI in GODOT specializzati in precise funzioni (musica, suoni, animazione, pulsanti, collisioni, …)

  • Un gruppo di NODI può essere infine salvato come SCENA per essere facilmente riutilizzato in…altre SCENE

Ed ora…lo creiamo o no questo giochino?

Mi rendo conto solo dopo svariati tentativi che mettere per iscritto una cosa così VISIVA come l’uso di un game engine sia davvero un’ardua impresa.

Di seguito cercherò di mostrarvi e descrivervi tutte le schermate che ci porteranno alla creazione di un giochino alla Flappy Bird (link video per chi non lo conoscesse). Poiché non sarà possibile descrivere ogni singolo incremento del codice ho deciso di mostrarvi fin dal principio l’intera scaletta del nostro sviluppo per poi entrare nel dettaglio di tutte le maggiori entità.

Ecco dunque di seguito le risorse che vi metto a disposizione:

Scaletta “Floppy Bird”

  • MenuNode con button START e CAMERA
  • WorldNode con button BACK e CAMERA
  • PlayerNode (sprite, collision) e aggiungiamolo al WorldNode
  • PlayerNode (gravity)
  • PlayerNode (FLAP)
  • WallNode (sprite, collision, movement) e aggiungiamolo al WorldNode
  • Arriviamo fino a 5 WallNode
  • Integriamo la logica di collisione del PlayerNode col body del WallNode
  • Creiamo la classe GLOBALE “Globals.gd” e aggiungiamola all’ AUTO LOAD del progetto
  • Aggiungiamo la PointArea al WallNod
  • Integriamo la logica di collisione del PlayerNode con la PointArea del WallNode
  • Mostriamo i vari score durante la partita con una Label
  • Quando muoio, salvo eventualmente il BEST SCORE
  • Creiamo una “reset area” per riposizionare e creare un loop di muri
  • Salviamo l’eventuale best score in un file quando moriamo
  • Quando si auto carica GLOBALS.gd leggiamo il best score nel file
  • A questo punto aggiungiamo il BEST SCORE anche nel menu iniziale
  • Aggiungiamo una fonte di luce (Light2D) al WorldNode
  • Aggiungiamo degli occlusori di luce al nostro WallNode
  • Cambio dello sprite del player con un ANIMATED SPRITE flying bird
  • ANIMATED SPRITE Infuocata quando supero il best score
  • MovingWall

Globals.gd (scritp)

Script nella root del progetto. Conterrà i nostri elementi “globali” come ad esempio lo score attuale ed il best score. Per essere caricato automaticamente all’avvio del gioco dovremo impostarlo nella sezione AutoLoad del progetto

Come ultimo passaggio per completare il grafo di esempio che vogliamo riprodurre ho creato e popolato in modo del tutto analogo anche la tabella arco che rappresenta il legame tra due persone, chiamata AmicoDi ovvero un arco che collega la tabella Persone a sé stessa (stavolta senza attributi).

A questo punto abbiamo ricreato esattamente la struttura che volevamo, e possiamo eseguire qualche query per renderci conto di come estrarre informazioni dal sistema appena costruito.

StartMenuNode.tscn (SCENA)CH

Scena aggiunta alla folder “scenarios”. Leggerà da un file il best score registrato (letto da Globals) ed il pulsante start ci porterà al vero e proprio gioco. Di seguito lo script associato alla scena e che regola i suddetti comportamenti.

StartMenuNode.gd (script)

WallNode.tscn (SCENA)

La scena del nostro muro è posizionata nella folder entities e si compone di 3 parti: porzione superiore, porzione inferiore del muro (il contatto col player indicherà il fine/reset partita) e l’area centrale denominata PointArea. Il player che entra in una PointArea incrementerà il suo punteggio di 1. Il muro dovrà muoversi a velocità costante verso la parte sinistra dello schermo, mentre il giocatore potrà “volare” verticalmente rimanendo sempre al centro.

WallBody.gd (script)

PlayerNode.tscn (SCENA)

La scena del nostro player è posizionata nella folder entities ed è formato principalmente da un corpo principale (con sprite), un’area leggermente più grande di lui per registrare le collisioni ed un’eventuale sprite animata che si attiva al superamento del best score. Il player viene sempre attirato giù da una costante gravità e l’unico modo che avrà di volare sarà quello di sbattere le ali premendo il comando FLAP che legheremo al pulsante spazio nelle impostazioni di progetto.

PlayerBody.gd (script)

WorldNode.tscn (SCENA)

La scena del nostro mostro di gioco è posizionata nella folder scenarios.

Gli elementi che la compongono saranno il player, delle copie di muri statici, un muro mobile, un’area di reset dei muri (per riportali a sinistra senza generarne di nuovi all’infinito) ed un pulsante per tornare al menù iniziale. Immancabile ovviamente la label a centro schermo per indicare i vari score.

WorldNode.gd (script)

Che aspettate? Premete F5 per avviare la compilazione del tutto ed avviare la vostra personalissima copia di Floppy Bird!

Articolo a cura di Luca Cerini, Senior Developer in Orbyta Tech, 23/08/2022

#jointherevolution