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.

6 commenti:

Mattia Bulgarelli (K. Duval) ha detto...

Niente quiz per vedere chi è stato attento, stavolta? ^_^

Luca Bonisoli ha detto...

No, stavolta no.
Per i prossimi quiz si dovrà aspettare un po', ma in compenso saranno diabolici! ^__-

44rivax ha detto...

ma qualche stringa di codice? che software si può usare? O magari all'inizio fare un piccolo riassunto con i link dei precedenti post.. (anche perchè se parti in quarta senza spiegare nulla le persone potrebbero non capire o ritrovarsi disorientate)

Luca Bonisoli ha detto...

Nooo, niente codice! ^__^
Dovrei entrare troppo nei dettagli, risulterebbe troppo noioso, finire per scrivere un'enciclopedia... e rivelerei al mondo (soprattutto a chi se ne intende) che come programmatore sono una mezza capra!!! ^__^'

Comunque per realizzare il gioco sto utilizzando Flash CS4 (anche se programmo ancora con ActionScript2).

Per leggere tutti gli articoli di questa serie basta cliccare sull'etichetta "facciamo un (video)gioco", in fondo al post oppure nella colonna a destra.

44rivax ha detto...

Luca, ti segnalo un'errore di scrittura

"...Nel prossimo articolo ci occuperemo del secondo ostacolo (passare dal singolo labirinto ad un vero dungeon con più livelli), metre gli altri...."

mentre


Cmq realizzare un piccolo videogioco sarebbe il mio sogno (anche se poi non ho tempo)

Luca Bonisoli ha detto...

Ho corretto, grazie! ^__^

Per realizzare un videogioco, Flash permette di fare cose incredibili, ma ha lo svantaggio che si deve fare tutto da zero e non si può evitare una parte consistente di programmazione.
In alternativa, per fare giochi in 2D ho trovato un prodottino molto interessante chiamato "The Games Factory 2", sviluppato da ClickTeam.
Ci vuole un minimo di pazienza per capire come ragiona il programma, ma una volta entrati nell'ottica giusta è uno strumento fatto veramente bene.
Permette di creare giochi rapidamente senza scrivere una sola riga di codice (la programmazione degli eventi è interamente gestita da procedure "guidate") ed ha molte funzioni complesse predefinite (es. la gestione del movimento degli oggetti: basta selezionare il tipo di movimento ed il programma fa tutto da solo).
In più ce n'è una versione gratuita, che non guasta mai (è la "newgrounds edition" - puoi scaricarla da qualche parte nel sito www.newgrounds.com - non mi ricordo la pagina precisa da cui ho preso la mia copia).
Il principale svantaggio è che TGF2 non gestisce la grafica vettoriale (al contrario di Flash), quindi è necessario realizzare tutti gli elementi grafici del gioco come immagini raster (GIF, PNG, JPG...)