Rust, Bracket-lib e Macroquad (Polpi e rot.js parte 2)
La tenera mascotte di Rust
Le ultime modifiche a Octo Chase
Come avevo già menzionato nella parte precedente, ho fatto gli ultimi ritocchi ad OctoChase: ho aggiunto il field of view e ho fatto in modo che lo squalo possa inseguire il polpo anche se lo perde di vista, ma lascerà perdere dopo alcuni "tick" del gioco in cui non riesce a vederlo. Questo ha portato anche all'aggiunta di un tasto per fare "attendere" il polpo, così che si possa nascondere e semplicemente aspettare che lo squalo smetta di inseguirlo. Tutto questo sfruttando già le funzionalità offerte dalla libreria.
Il field of view in azione. Notare la fog of war che grazie a rot.js ti viene fuori gratis
Che bello 'sto Rust
Nonostante tutto, non ero completamente soddisfatto. Volevo imparare qualcosa di nuovo e non solo migliorarmi in quello che conoscevo già. Ascoltando il parere di un collega, mi è capitato così di curiosare su Rust.
Tutti ne parlavano bene, e aveva quella sintassi C-like, l'attenzione alla gestione della memoria senza garbage collector e il sistema di crate che mi piacevano parecchio. Anche Rust non è, per le sue caratteristiche, il linguaggio più adatto per sviluppare videogiochi, ho deciso di impararlo e usarlo per sviluppare il mio roguelike.
Borrowing, Ownership e di come ho imparato ad odiarli amarli
Come ho anticipato, Rust è un linguaggio che promette (e mantiene) una gestione della memoria molto sicura senza garbage collector e le prestazioni paragonabili a linguaggi come C e C++. Questo lo rende possibile grazie ad una politica borrow / move / ownership che viene controllare durante la compilazione.
Questo è un paradigma nuovo e che potrebbe sembrare"strano": in pratica ogni variabile possiede il valore contenuto al suo interno, e viene deallocato non appena non serve più (generalmente quando si esce dallo scope dove è dichiarata).
La proprietà di un valore può essere passata ad una funzione, tenendo conto che questo spostamento "consumerà" il valore della variabile con la fine dell'esecuzione della funziona. Se non vogliamo che questo accada, bisogna cederla in prestito utilizzando il passaggio a riferimento ( usando & come per C ).
È complicato, sicuramente non l'ho spiegato bene è c'è molto altro da dire. Vi consiglio di leggere questo manuale: The Rust Programming Language.
Bracket-lib, ma poi Macroquad (a modo mio)
Oltre al manuale citato, ho seguito anche quest'altro tutorial: Roguelike Tutorial - In Rust . Per questo, inizialmente, il gioco avrebbe dovuto utilizzare la libreria per giochi roguelike in Rust bracket-lib (che nel tutorial è citata come rltk). Sebbene quella libreria sia molto completa in termini di funzionalità, ho deciso quasi subito di aver bisogno di più controllo sul codice e libertà sulle implementazioni.
Dopo aver valutato diverse engine per videogiochi in Rust, ho deciso di utilizzare Macroquad, una libreria minimale ispirata a raylib e che vuole offrire un set di strumenti per poter realizzare giochi senza molte parti aggiunte. Vista la sua natura open source, ho anche avuto modo di scaricarne il codice e personalizzarlo per raffinare l'input da tastiera in modo da emulare il comportamento che è presente in tutti i roguelike più radizionali. Qui potete vedere la mia personale versione di Macroquad.
ECS
A differenza di Langobardia Horribilis: in Trebia, qui ho preferito imparare un nuovo design pattern chiamato ECS (Entity, Component System). Per farla molto breve: invece di ragionare tramite Oggetti che hanno un numero predefinito di attributi e uno stato mutabile, qui ci sono delle Entità che possono avere in modo dinamico e flessibile un numero variabile di Componenti. Entità e Componenti interagiscono tra loro tramite Sistemi, che implementano quali comportamenti hanno questi elementi dopo averli raccolti in tuple.
Commenti
Posta un commento