mercoledì 27 aprile 2011

FACCIAMO UN (VIDEO)GIOCO? - PARTE 3


Nel precedente articolo abbiamo creato il labirinto; ora dobbiamo visualizzarlo. Ci serve quindi una schermata che mostri tutte le pareti come se stessimo guardando da una finestra (visualizzazione "in soggettiva") e per farlo dobbiamo ricorrere alle regole della prospettiva centrale.
Il nostro campo visivo sarà quindi composto da 3 tipi di elementi: lo sfondo, le pareti e gli "oggetti" (mostri, forzieri, teletrasporti, ecc...) che possono occupare i corridoi.

Lo sfondo
E' piuttosto semplice: si tratta di un gradiente lineare che parte da un colore di base in alto e in basso e sfuma verso il nero al centro, per suggerire l'idea che il giocatore abbia con sè una sorgente di luce (torcia, lanterna, o altro), quindi gli oggetti vicini sono ben visibili mentre in lontananza il labirinto sfuma vero l'oscurità. Per aggiungere varietà perdendo poco tempo, si possono creare più sfondi diversi (es. una dozzina) semplicemente cambiando il colore del gradiente e aggiungendo a mano delle irregolarità.

Le pareti
Qui il discorso si fa decisamente più complesso. La prima cosa da decidere è la profondità del campo visivo (fino a quante celle di distanza sono visibili le pareti?). Più aumenta la distanza, più elementi sono visibili, più la programmazione diventa complessa. Un buon compromesso è costituito da 4-5 file di celle davanti all'osservatore. Anche in questo caso, più le pareti si allontanano dall'osservatore (cioè dalla luce), più sono scure per dare l'impressione della profondità. Considerando 5 file di celle nel campo visivo, compresa quella in cui si trova l'osservatore (cioè il giocatore), le pareti potenzialmente visibili sono 24, come mostrato nell'immagine qui sotto (le pareti sono in colore blu; il campo visivo in colore rosso):


Ora però le pareti vanno disegnate!
Fondamentalmente le pareti hanno 2 sole possibili geometrie: rettangolare (per quelle poste di fronte all'osservatore) e trapezoidale (per quelle poste lateralmente rispetto all'osservatore). Impostando la prospettiva in modo opportuno, è sufficiente disegnare una sola parete per ciascun tipo e tutte le altre possono essere derivate da quelle due, semplicemente cambiandone le dimensioni e/o "stirandole" un po'. Non male come risparmio di fatica, vero?
A proposito di risparmio di fatica: anche per le pareti si può dare l'impressione della variabilità creandone diverse copie (es. una dozzina) che differiscono solo per il colore. Se calcoliamo le possibili combinazioni di colore delle pareti e dello sfondo, otteniamo circa 150 "look" diversi, sufficienti per non annoiarsi troppo.

Gli "oggetti"
Per "oggetti" intendo qualsiasi elemento che occupi una cella (mostri, tesori, teletrasporti, ecc...). Nell'immagine all'inizio di questo articolo, gli oggetti sono esemplificati da un cilindro verticale. Vista la forma del campo visivo (disegnato in rosso nella seconda immagine di questo articolo), i possibili oggetti da mostrare sono 12.

Mettiamo insieme la schermata
In totale gli elementi che compongono il campo visivo sono 37 (lo sfondo, 24 pareti e 12 oggetti). Ognuno deve stare su un piano prospettico separato (più precisamente su un "livello" separato, come in Photoshop), in modo che i più vicini all'osservatore si trovino sovrapposti a quelli più lontani e li nascondano. Il tutto, infine, dev'essere racchiuso dentro ad una "maschera" che permetta di vederNe solo una porzione, come guardando attraverso una finestra.

Nel prossimo articolo entreremo nel nostro labirinto e lo vedremo dall'interno!

giovedì 21 aprile 2011

HADOKEN!!!


Fanart che ho commissionato al prode Aurelio Mazzara per un regalo di compleanno. I colori naturalmente sono miei.

venerdì 15 aprile 2011

FACCIAMO UN (VIDEO)GIOCO? - PARTE 2


Il videogioco che ho iniziato a realizzare e di cui ho parlato nel precedente post sarà suddiviso sostanzialmente in due parti: una di esplorazione del labirinto ed una di combattimento e gestione dei personaggi creati dai giocatori.
Visto che queste due parti si sovrappongono molto poco, possiamo tranquillamente iniziare dalla prima senza preoccuparci troppo, per il momento, della seconda.
Concentriamoci quindi sull'esplorazione del labirinto.

Primo problema: per avere un labrinto da esplorare, bisogna crearlo! Come si può fare?

Ricorderete che l'idea iniziale era quella di impostare il gioco in modo procedurale, quindi la creazione dei labirinti dev'essere automatica.
Esistono diversi algoritmi per generare labirinti. Quello che ho scelto è chiamato "Randomized depth-first search" implementato con una variante detta "Recursive backtracking". Al di là dei nomi, che sembrano complicatissimi e spaventano, il procedimento in realtà è relativamente semplice:
1 - Il labirinto può essere pensato come una griglia quadrata di celle, che all'inizio sono tutte "piene" (come se si trovassero sepolte all'interno di una montagna).
2 - Si individua a caso una cella di partenza ad un'estremità del labirinto e la si "svuota" (come se si scavasse via un cubo di roccia dentro la montagna).
3 - Si controlla quali celle tra le confinanti sono "piene", considerando un raggio di 2 celle (cioè: non solo le celle confinanti, ma anche quelle dietro di esse). All'inizio, naturalmente, tutte le celle sono piene e quindi tutte le direzioni sono "ammissibili" per costruire il labirinto. Il dettaglio di considerare 2 celle anzichè 1 è molto importante, ma non voglio addentrarmi troppo in tecnicismi, quindi non sto a spiegarvi il motivo (quiz a sorpresa: chi riesce ad arrivarci da solo?).
4 - Si sceglie a caso una direzione tra quelle ammissibili e si "scavano" due celle consecutive, svuotandole.
5 - Ci si sposta nell'ultima cella appena svuotata.
6 - Si continua a "scavare" ripetendo i passaggi 3-4-5 e cambiando direzione a caso, fino ad arrivare a una cella dove non è più possibile "scavare" in nessuna direzione. Questa cella è l'uscita. Se guardiamo bene, ci accorgiamo che il percorso finora è privo di ramificazioni ed occupa solo una porzione relativamente piccola della griglia, quindi non è un granchè come labirinto.
7 - Per aggiungere le ramificazioni, si ripercorre all'indietro il percorso "scavato", spostandosi di due passi (due celle) alla volta, fino a trovarne una da cui si può ricominciare a "scavare" in un'altra direzione.
8 - Si "scava" fino a quando è possibile, poi di nuovo si ritorna indietro passo-passo fino al punto in cui si può ricominciare a "scavare" in un'altra direzione, e così via fino a quando non si è ritornati alla cella di partenza e non è più possibile scavare in nessuna direzione. Il labirinto ora è completo, però è composto solo da corridoi, senza stanze.
9 - Per aggiungere anche le stanze, si possono distribuire a caso nella mappa un certo numero di blocchi quadrati di 2 x 2 celle vuote, "scavando" le celle "piene" che cadono all'interno di quei blocchi. Il risultato saranno stanze dalla forma irregolare, che derivano dall'interazione casuale tra la geometria dei corridoi e quella dei blocchi 2 x 2.

Che fatica! A leggerlo sembrava più semplice!
Però almeno adesso i labirinti creati automaticamente hanno un aspetto decente, inoltre posso generarne un numero pressochè infinito, ognuno diverso dall'altro... e tutto quello che deve fare il giocatore è specificare lunghezza e larghezza della griglia! (altro quiz a sorpresa: per un risultato ottimale, lunghezza e larghezza del labirinto devono essere due numeri dispari e anche la cella iniziale deve trovarsi in posizione "dispari". Sapreste spiegarmi perchè?)

Proseguendo, ora che abbiamo il nostro labirinto possiamo popolarlo di elementi "statici" (cioè: che non si muovono).
- Entrata e uscita le abbiamo già individuate. Per aggiungere un pizzico di sfida in più, mettiamo un mostro che funga da "boss di fine livello" proprio davanti all'uscita.
- Poi passiamo ai forzieri. Per semplicità li collocheremo alla fine di tutti i "vicoli ciechi" (terzo quiz a sorpresa: come posso far capire al computer che una cella si trova alla fine di un vicolo cieco e non invece in mezzo a un corridoio?). Alcuni forzieri conterranno un tesoro ed altri una trappola, con una probabilità che dipende dalle impostazioni definite dal giocatore.
- Infine, visto che utilizzando l'algoritmo "depth-first search" i vicoli ciechi (e quindi i forzieri) sono molto pochi, dobbiamo aggiungere anche ulteriori tesori e trappole distribuiti a caso nei corridoi e nelle stanze. Anche in questo caso il numero di tesori e di trappole dipende dalle impostazioni definite dal giocatore.

Uno dei possibili risultati, disegnato con caratteri di testo, potete vederlo nella figura all'inizio di questo articolo. E' la rappresentazione di un labirinto generato automaticamente in una griglia di 21 x 21 celle. Le impostazioni definite dall'utente sono solo 4: lunghezza, larghezza, frequenza dei tesori, frequenza delle trappole. Tutto il resto è generato dal motore di gioco.

Legenda:
# = Muro
* = Casella di partenza
$ = Forziere contenente un tesoro
T = Forziere contenente una trappola
+ = Tesoro lungo un corridoio o in una stanza
! = Trappola lungo un corridoio o in una stanza
B = Boss di fine livello
@ = Teletrasporto (uscita)

Nel prossimo articolo ci occuperemo della schermata che riproduce la visuale "in soggettiva".

mercoledì 13 aprile 2011

COMPITO IN CLASSE DI TERZA ELEMENTARE


Tema: spiega con parole tue perchè l'idea di un Paese senza giudici è una vaccata mondiale.

(immagine tratta dal sito http://www.repubblica.it)

venerdì 8 aprile 2011

FACCIAMO UN (VIDEO)GIOCO? - PARTE 1


Come ho già avuto modo di scrivere, sono un appassionato di videogiochi e mi diverto anche a realizzarli, soprattutto con Flash. Ne ho già fatti alcuni in passato, potete trovarli qui, qui e qui (ci sarebbe in ballo anche un quarto progettino, ma per ora mantengo il riserbo. Rilascierò qualche anticipazione più avanti, quando sarà il momento... ^__^).

Ultimamente ho deciso di rimettermi all'opera, con calma, senza una scadenza precisa e condividendo sul blog tutte le fasi della lavorazione (ma senza entrare nei noiosi dettagli della programmazione).
Non sono un professionista, quindi molte delle considerazioni e delle soluzioni tecniche che adotterò saranno inefficienti. Pazienza, non si può avere tutto dalla vita.

Il gioco che vorrei fare è ad ambientazione fantasy ed appartiene al genere dei cosiddetti "dungeon crawler" con vista "in soggettiva". Per capirci, intendo ispirarmi a miti degli anni '80-'90 come Eye of the Beholder o Dungeon Hack, dove un gruppo di avventurieri deve trovare la via d'uscita in un complesso labirinto, mentre tenta di sopravvivere ai combattimenti contro le creature che lo popolano. Nell'immagine all'inizio del post potete vedere come mi immagino grossomodo la schermata di gioco.

Naturalmente per questioni di tempo dovrò tagliare brutalmente sulla parte grafica e sulle funzionalità di gioco, e questo è un bel problema! Infatti, se il gioco è bruttino e le meccaniche sono pure scarne, il tutto diventa rapidamente noioso.

Come posso fare allora perchè valga la pena di realizzare quello che ho in mente di fare? Come posso produrre un gioco che sia almeno un minimo divertente e che non finisca subito?
Seguendo due linee-guida:
1 - Pensare in piccolo = non posso creare un nuovo Final Fantasy, però posso fare un giochino per passare il tempo ogni tanto.
2 - Adottare un'impostazione "procedurale" = invece di inserire tanti elementi singoli e specifici, disegnati e programmati uno ad uno, è meglio individuare una serie di fattori che possono avere un certo numero di variazioni e fare in modo che sia il motore di gioco a mescolarli più o meno casualmente per generare ogni volta combinazioni diverse, facendo così in modo che il tutto sembri più vario di quanto non sia in realtà.

Ecco spiegato perchè si è fatta strada nella mia mente l'idea del dungeon crawler con vista in soggettiva:
- E' relativamente semplice da programmare
- Ha un impatto visivo più interessante rispetto ad altri tipi di visualizzazione (es. dall'alto oppure laterale), quindi posso fare una figura decente anche con una grafica mediocre
- Può essere strutturato in modo procedurale con estrema facilità (labirinti generati casualmente, grande possibilità di personalizzare le caratteristiche dei labirinti e dei personaggi, ecc...)
- Sorprendentemente in giro per la rete non ho trovato nessun giochino Flash dello stesso tipo!!!

Nel prossimo post di questa serie entrerò un po' più in dettaglio nel game design.