Polpi e rot.js
Ieri ho deciso di darmi ai Roguelike. Per chi non lo sapesse, si vada a leggere la definizione di questa "etichetta" su wikipedia. Non ho voglia di dilungarmi oltre, quindi do per scontato che da questo momento in poi siate tutti a conoscenza del significato di quella parola.
In breve: ho usato una libreria per creare un giochino in javascript dove sei un polpo affamato che vuole mangiare un granchio ed evitar uno squalo. Potete provare il gioco qui. Se invece volete vedere il codice, lo trovate qui.
... quando ho trovato questa pagina di un blog per puro caso, spulciando nel mio feed: Building a roguelike game with rot.js. Avendo voglia di fare "palestra" con il Javascript e di ritornare a sviluppare videogiochi dopo un periodo di pausa, mi sono detto: "Perché no?"
Cominciare piano
Avendo necessità di partire un passettino alla volta e a non perdermi nel solito progettone con manie di grandezza, decido di aggiungere a quanto spiegato nella pagina di cui sopra alcuni tutorial trovati su Roguebasin: sito importante come archivio di informazioni per sviluppare un Roguelike
Sebbene io usi spesso Javacript nel mio principale lavoro, mi ritrovo a doverlo fare adeguandomi a convenzioni di progetto che mi "costringono" a concentrarmi su un certo modo di sviluppare. Con questo progetto, però, volevo riprendere in mano tutti i concetti che normalmente non mi capita di usare. Classi ed ereditarietà sono per me il pane quotidiano in Java, molto meno in Javascript.
Rispetto al tutorial originale, ho cambiato l'ambientazione spaziale in una marina: sei un polpo (🐙) che deve navigare in un labirinto di roccia (🌑) per mangiare un granchio (🦀). Quando riesci a farlo, un messaggio viene mostrato a schermo.
Come prima cosa ho replicato tutto il contenuto del tutorial, con la mia personale code review e utilizzo delle classi.
Ho deciso poi di aggiungere la possibilità per il granchio di muoversi sullo schermo, per rendere più caotica la partita. Per farlo, lui seleziona una direzione casuale tra su, giù, destra e sinistra: se la "cella" è libera, si muoverà lì.
Infine, ho aggiunto uno squalo (🦈) in grado di inseguire e uccidere il polpo, in modo da creare una condizione di sconfitta. Il pathfinding era già implementato in rot.js e l'ho configurato con una topology di 4: questo vuol dire che lo squalo non si muoverà mai in diagonale, restringendo così la sua possibilità di movimento alle singole direzioni su, giù, destra e sinistra.
Per sfruttare altre funzionalità della liberia, ho deciso che il granchio dovesse essere più lento rispetto al polpo. Ho dunque utilizzato lo Scheduler di ROT.js, una classe che riceve una lista di attori da temporizzare.
Assegnando una velocità numerica a ciascun attore, è possibile fare in modo che alcuni attori abbiamo meno azioni di altri. Il granchio ha infatti velocità 1, il polpo e lo squalo hanno una velocità di 2.
Anche se il giochino è completo, sarà la base di un progetto molto più grande che sul quale sto elucubrando in questi giorni. Ma in termini di aggiornamenti immediati, ho già implementato il field of view, in modo che il polpo non possa vedere sempre tutta la mappa ma piuttosto che la sua visibilità sia influenzata dai muri. In questo modo, la ricerca del granchio e la fuga dallo squalo hanno una tensione molto maggiore, perché il polpo può trovarsi intrappolato in un vicolo cieco che non aveva visto subito!
Commenti
Posta un commento