giovedì 14 luglio 2011

FACCIAMO UN (VIDEO)GIOCO? - PARTE 6

Inserisci link
Come dicevamo nello scorso articolo, oggi passiamo dal singolo labirinto al vero e proprio dungeon multi-livello.

Cominciamo come al solito con un po' di pianificazione, tenendo sempre presenti i due concetti fondamentali: pensare in piccolo e impostare il gioco in modo procedurale:
- in questo caso "pensare in piccolo" significa che il gioco dovrà essere ridotto ad un puro e semplice dungeon crawler: nessun PNG con cui interagire, nessuna quest, nessuna possibilità di ritornare ai livelli precedenti del dungeon. Sarebbero tutte caratteristiche bellissime, per carità, ma sfortunatamente per essere implementate richiederebbero molto più tempo di quanto io possa dedicarci, quindi ahimè dovremo eliminarle.
- "impostare il gioco in modo procedurale" significa dare al giocatore la possibilità di impostare alcuni parametri, facendo gestire tutto il resto al computer.

Tradotto in pratica, questo significa che:
- il giocatore potrà impostare la profondità del dungeon (es. da 5 a 30 livelli);
- si inizierà con una breve introduzione che spiega la storia dietro al gioco (ci ho ragionato un po' sopra e mi pare di aver ideato una trama in grado di giustificare in modo abbastanza plausibile sia le limitazioni a cui ho accennato sopra, sia altre che introdurrò più avanti);
- subito dopo il gioco entrerà direttamente nel vivo con l'esplorazione del primo livello del dungeon, generato casualmente;
- ogni volta che si accede ad un nuovo livello del dungeon la mappa precedente viene cancellata ed il nuovo livello viene creato da zero (quindi non è possibile, nè necessario, salvare le mappe dei livelli precedenti)
- Dopo aver raggiunto l'uscita dell'ultimo livello del dungeon, si passa alla schermata (o alle schermate) di epilogo, dove si conclude la storia.

Dal punto di vista della programmazione, questo sistema è molto lineare, quindi concettualmente semplice da implementare:
- dopo aver impostato le caratteristiche del dungeon e creato i personaggi, si passa alla prima schermata dell'introduzione, poi alla seconda e così via;
- dopodichè si genera automaticamente il primo livello e si avvia il gioco;
- all'uscita del primo livello si genera automaticamente il secondo, poi il terzo e così via fino all'ultimo. Sono sufficienti due variabili: una che contiene il numero totale dei livelli (impostato dal giocatore) e l'altra che contiene il numero del livello corrente. Quando il livello corrente è uguale al numero totale dei livelli, significa che è stato raggiunto l'ultimo livello del dungeon.
- all'uscita dell'ultimo livello si passa alla schermata della conclusione.

Una leggera complicazione tecnica di tutto questo procedimento (nulla di insormontabile, comunque) è data dal fatto che non posso semplicemente "staccare" improvvisamente da una schermata all'altra, ma devo inserire delle transizioni (fade out - fade in) per rendere i passaggi meno improvvisi e quindi più gradevoli.

Così anche questa è fatta: abbiamo l'introduzione, l'intero dungeon completamente esplorabile e la conclusione. La prima parte del gioco (diciamo il "contenitore") è completa. Ora dobbiamo iniziare a riempirlo di "contenuti" aggiungendo avventurieri, mostri e tesori. Cominceremo nel prossimo articolo con gli avventurieri.

giovedì 7 luglio 2011

FLASHPOINT


Quanto mi piace questa serie televisiva! ^__^
Ultimamente mi capita di vederla abbastanza spesso su Rai4 e sin dalla prima volta mi ha subito colpito positivamente!

Ma partiamo dall'inizio: la serie è incentrata su una squadra di agenti speciali canadesi della cosiddetta Strategic Response Unit, che vengono chiamati in causa in situazioni ad alto rischio in ambiente urbano, ad esempio la liberazione di ostaggi.

La cosa che mi piace maggiormente di questa serie, oltre all'ambientazione poliziesca, è l'estremo realismo con cui vengono affrontati i temi. In altre parole, non è una spacconata:
- gli agenti non irrompono con le armi spianate se non è assolutamente necessario;
- i "cattivi" non sono quasi mai davvero cattivi, ma persone normali sottoposte a forti stress emotivi;
- gli psicologi si comportano come tali senza fare nè la figura dei cretini nè quella dei maghi;
- i gadget tecnologici non sono troppo fantascientifici;
- gli agenti non si lanciano mai in gesti inutilmente eroici "perchè fa più figo".

Inoltre nel telefilm viene impiegata un'estrema cura nel rappresentare gli aspetti procedurali, dall'addestramento quotidiano degli agenti ai vari passi successivi attuati per risolvere la crisi (stabilire il posto di comando, raccogliere informazioni, contattare i sequestratori, negoziare mentre parallelamente gli agenti operativi si posizionano nei punti strategici pronti ad intervenire).
Non sempre si raggiunge un lieto fine, ma quando questo accade -magari senza sparare neppure un colpo in tutta la puntata- come spettatore trovo il risultato davvero soddisfacente.

Insomma, se non avete mai visto Flashpoint, ve lo consiglio vivamente: guardatene qualche puntata, poi mi dite cosa ne pensate! ^__^

martedì 5 luglio 2011

FACCIAMO UN (VIDEO)GIOCO? - PARTE 5


Ci siamo: finalmente è ora di iniziare ad esplorare il labirinto! Affrontiamo quindi il problema del movimento.

Innanzitutto decidiamo come impostarlo: per questioni di semplicità, ci muoveremo "a scatti" di una cella per volta e le rotazioni (girare a destra e a sinistra) saranno solo di 90°; inoltre il movimento sarà comandato dai tasti delle frecce direzionali (freccia in su = "un passo avanti"; freccia in giù = "un passo indietro"; freccia a sinistra = "gira a sinistra"; freccia a destra = "gira a destra").

Il secondo passaggio è definire nei dettagli come avviene il movimento. Prima di spostare il nostro personaggio da una cella a un'altra, infatti, il motore di gioco deve verificare se quel movimento è ammesso oppure no, ed eventualmente lanciare qualche tipo di evento collaterale (es. far scattare una trappola che si trova nella cella di destinazione). Solo dopo questa verifica il passaggio ad una nuova casella può essere effettuato. La verifica si può sintetizzare più o meno in questo modo:
I movimenti di rotazione (girare a sinistra e a destra) sono sempre ammessi; per gli spostamenti (passo avanti e passo indietro) devo invece prima verificare il contenuto della cella di destinazione:
- se la cella di destinazione è un muro, il passo non si può fare;
- se la cella di destinazione è un corridoio vuoto, il passo si può sempre fare;
- se la cella di destinazione contiene un forziere chiuso, lo apro lanciando l'evento corrispondente (ottengo un tesoro oppure faccio scattare una trappola), poi sostituisco il contenuto della cella con un forziere aperto (senza effettuare il passo);
- se la cella di destinazione contiene un forziere aperto, il passo non si può fare;
- se la cella di destinazione contiene un tesoro casuale in mezzo al corridoio, lo raccolgo lanciando l'evento corrispondente e poi sostituisco il contenuto della cella con un corridoio vuoto (senza effettuare il passo);
- se la cella di destinazione contiene una trappola nascosta, faccio il passo e la faccio scattare lanciando l'evento corrispondente;
- se la cella di destinazione contiene un teletrasporto (uscita), ignoro lo spostamento e passo direttamente al labirinto successivo;
In questo modo, come si vede, tutti gli eventi di gioco vengono lanciati semplicemente tentando di "entrare" nella cella corrispondente. Questa è una bella semplificazione, perchè è molto intuitiva e non mi obbliga ad elaborare un sistema per avvisare il giocatore dell'evento, chiedendogli magari conferma e gestendo la risposta.

Infine, dopo tutte le verifiche e le funzioni sopra riportate, l'ultima fase è quella di aggiornare la finestra di visuale in soggettiva come descritto nel precedente articolo, per mostrare il movimento compiuto.

Ora, dopo aver pianificato tutto, si passa alla realizzazione ed emergono subito i primi problemi.

Ad esempio: se tengo premuto un tasto direzionale, lo spostamento viene ripetuto in modo talmente rapido da risultare fastidioso, inoltre si rischia di effettuare inavvertitamente più spostamenti consecutivi solo tenendo premuto il dito sul pulsante un po' troppo a lungo. Devo quindi aggiungere un timer che blocchi l'input dei tasti per un certo periodo di tempo (mezzo secondo o anche meno), consentendo quindi di separare nettamente un comando dall'altro.

Secondo problema: devo implementare un sistema che gestisca la transizione da un labirinto all'altro e che mi permetta di "uscire" una volta terminato l'ultimo.

Terzo problema: molti degli eventi che ho citato sopra (raccogliere un tesoro, far scattare una trappola, ecc...) devono ancora essere programmati e richiedono la presenza di un "personaggio" a cui essere applicati.

Quarto problema: non ho ancora affrontato la parte relativa all'apparizione casuale di mostri da combattere, che hanno un'influenza pure sul movimento (per semplicità, durante i combattimenti il movimento sarà impedito).

Non c'è male come scaletta!
Per il momento ho risolto solo il primo problema (il più semplice) creando un timer che blocca l'input dei tasti per un certo periodo di tempo. Nel prossimo articolo ci occuperemo del secondo ostacolo (passare dal singolo labirinto ad un vero dungeon con più livelli), mentre gli altri problemi li affronteremo con calma più avanti.