Rust, Bracket-lib e Macroquad (Polpi e rot.js parte 2)

Se avete letto lo scorso post Polpi e rot.js , sapete che ora ho in testa un'idea per un roguelike. Quindi ho iniziato a rispolverare NetHack e altri giochi del genere per poi sviluppare qualcosa in Javascript in modo da prendere confidenza con il genere. Siccome l'appetito vien mangiando, voglio sfruttare l'occasione per imparare Rust.

In breve: sto imparando il linguaggio Rust e la libreria grafica Macroquad per creare un roguelike 

 

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

Questo codice Rust non compila. La stringa di s1 è "mossa" in s2. s1 non possiede più la stringa e quindi non è più valida. 

È 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


By Guypeter4 - Own work, CC0, https://commons.wikimedia.org/w/index.php?curid=142522905 

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.

Lo stato dei lavori

Potete provare il prototipo del gioco qui, mentre il codice sorgente lo trovate qui.

Commenti

Post più popolari