Grafica – Pausa e Game Over

In questo articolo continuerò la serie dedicata al mini gioco, creato nel tutorial precedente (se non l’hai letto ti consiglio di farlo). Riepilogando in breve nel gioco devi fuggire da cinque nemici, se vieni toccato da un nemico l’energia diminuisce, se l’energia finisce il gioco si chiude; questo è il punto in cui sono arrivato, ma adesso voglio creare un sistema di pausa e uno di game over in modo che il giocatore abbia la possibilità di riposarsi o veda la sua partita concludersi. 

Come prima cosa salvo il gioco con un’altro nome o aumento il numero progressivo in modo da non sovrascrivere il file che posseggo già, questo mi permette in caso di un errore grave di poter iniziare da capo, è un pò come avere un backup del proprio file. Il file di partenza lo puoi scaricare QUA. Iniziamo.

Game Over

Visto che ho già la conclusione del gioco direi di iniziare da questo punto, crea una nuova scena e rinominala game_over, aggiungi una camera e un oggetto Text, entra in Object Mode e cambia il testo in Game Over, scalalo in grandezza, non troppo, e posizionalo un pò in alto nella scena, questo ti permetterà di inserire in un secondo momento dei pulsanti, sarà l’argomento del prossimo tutorial, ma per ora va bene così. In questo caso il testo ‘Game Over’ è statico, quindi puramente scenografico, per trasformare l’oggetto da testo a una mesh premi ALT+C e dal menù che compare scegli Mesh from Curve/Meta/Surf/Text, questa opzione fa esattamente quello che dice, trasforma in mesh uno degli oggetti in elenco. Facendo così evito di dover ottimizzare il testo, anche se basta una riga di codice, quindi niente di speciale, ma non è il caso di questo tutorial. Adesso che hai una mesh aggiungi un materiale, io ho dato un colore rosso, azzera la Specula e metti la spunta su Shadeless, come per la Ebar in modo da non dover aggiungere lampade. E’ ovvio che a ogni passaggio è consigliabile salvare, il mio testo è come nell’immagine successiva

Puoi usare la stessa procedura per la scena della pausa, cambia il colore del testo (che sarà una mesh), ma il procedimento è identico. Crea da solo la scena di pausa, è un’esercizio di un paio di minuti che ti permette di memorizzare i passaggi sopra eseguiti per creare la scena game over. Una volta fatto avrai una scena tipo questa

identica alla precedente, ma con la scritta diversa. Questo sistema è semplice ed efficace, farò in modo che le due scene non si sovrappongano mai. E’ anche possibile usare una scena unica per comunicare col giocatore sia per la pausa che per il game over, usando dei messaggi (nella logica) e la visibilità degli oggetti (in questo caso dei testi trasformati in mesh), allo stesso modo si può fare con i pulsanti (che come detto vedrai nel prossimo articolo). Usare una scena sola però ha dei pro e dei contro, un pro che mi viene in mente è che in entrambi i casi (sia di pausa che di game over) la scena da richiamare è una sola; d’altra parte il contro è che si può perdere tempo nel fare in modo che vengano visualizzati alcuni elementi e altri no. Puoi provarci, non è difficile, ma prima salva con un nome diverso il file. Sia che tu abbia una scena sola, con entrambi i messaggi, sia che tu voglia seguire il tutorial così com’è, la logica non cambia molto, ti consiglio però di continuare con scene separate per capire il procedimento e una volta fatto tuo puoi anche decidere di eliminare una scena e accorparla a quella restante. Ma andiamo avanti con la logica del game over.

Logica Game Over

Seleziona l’Ebar, puoi farlo direttamente anche dall’Outliner o aprendo la scena HUD e selezionando l’oggetto direttamente nella 3D View. L’ultima linea di Mattoni dice che ‘quando l’energia arriva a zero il gioco si chiude’, elimina l’Actuator Game, al suo posto inserisci due Actuator un Message e uno Scene, nell’Actuator Message scrivi nel Subject end_game, queste due parole sono perfette per farti capire in un secondo momento cosa succede nel gioco, ti ricordo che rinominare gli elementi (oggetti, Mattoni, Properties, ecc ecc) è una pratica utile e ti risparmia grattacapi se un giorno vuoi modificare il tuo gioco. Rinomina anche l’Actuator con end_game. Il messaggio sarà per tutti gli oggetti, quindi non specifico nessun oggetto, diciamo che è un messaggio globale, ogni oggetto può riceverlo, così posso bloccare l’esecuzione delle logiche di qualsiasi oggetto della scena, dal player a un possibile timer ecc ecc. Nell’Actuator Scene cambia il Mode da Restart a Set Scene e dal menù a tendina del campo Scene scegli la scena game_over. così facendo la HUD verrà rimpiazzata dalla scena game_over, perché una volta che il gioco è finito la HUD non serve più, in questo caso ma se ci fosse un punteggio sarebbe ovvio tenerla o visualizzare il punteggio nella scena game_over, facendo così diminuisco anche il carico per il motore. Ti posto uno screen dei mattoni

Se provi il gioco adesso puoi vedere che una volta che l’energia finisce la scena game_over appare a video, ma il gioco continua che non è quello che voglio, vorrei che una volta che appare la scena game_over il gioco si ferma. 

Prima di proseguire devo spiegare una cosa, si può sospendere e riprendere una scena attraverso l’Actuator Scene, ma non lo si può fare dalla scena corrente, cioè la scena game, per esempio, non può sospendersi o ripartire da sola, deve essere un’altra scena a dire alla scena game (in questo esempio) di ripartire o sospendersi; le opzioni nel Mattone sono suspend e resume. Detto questo bisogna creare una situazione che interrompa l’esecuzione della scena di gioco, per farlo devo seguire la logica che sto creando. Questo discorso vale quasi per tutte le logiche che implementi nei vari giochi, per farti un’esempio è come se stai costruendo un palazzo e di norma si parte dalle fondamenta e su su fino al tetto, quando fai un muro è ovvio che calcoli lo spazio per una porta o una finestra, quindi alzi il muro sapendo che a 1.5 ci sarà il buco della finestra.
Magari l’esempio del palazzo non è il migliore, forse capirai fra un pò questo concetto. Sono arrivato ad un punto dove la scena HUD è rimpiazzata da quella game_over quando l’energia si è esaurita, ma il gioco non sa che ho rimpiazzato le due scene, infatti nella scena game (quella principale) la camera continua a tenere in overlay la scena HUD, questo torna utile in questo momento dello sviluppo ma anche in altri. Quindi è nel momento che le due scene si scambiano che voglio che la scena principale (game) si fermi (suspend), per farlo devo agire da una scena secondaria, siccome a video ci sono solo la principale e la game_over è palese che dovrò aggiungere la logica per la sospensione nella scena game_over; in questo modo la mia logica avrà come una sequenza degli eventi legati ad un filo o un discorso fatto di eventi a cascata che fanno si che il gioco sia una concatenazione di se stesso. Per dirla in breve : ‘quando l’energia finisce, scambio le due scene e blocco la scena principale dalla scena secondaria game_over’. Questo ragionamento può sembrare anche un pò stupido perché scontato, ma non è detto, perché in un gioco complesso è facile perdere il filo e trovarsi senza capire più come implementare una certa logica, solo perché non si è seguito un filo logico. Per chiudere questo discorso puramente teorico e tornare ai Mattoni da aggiungere, dico che spesso ci si trova davanti a una logica confusa che può ritorcersi contro lo sviluppatore e fare perdere ore solo per capire come funziona, ne ho viste di logiche senza capo ne coda che spesso mi fanno abbandonare l’idea di capire cosa quel gioco faccia. 

Torniamo così ai Mattoni e continuando capirai di cosa parlavo nella parte teoria (un pò confusionaria) precedente.

Puoi inserire questi Mattoni sia sulla camera che sull’oggetto (scritta) Game Over, non ha importanza. Inserisci un Sensor Always e collegalo tramite un Controller And ad un’Actuator Scene, cambia il Mode da Restart a Suspend e scegli dal menù a tendina Scene la scena game (quella principale). Adesso quando la scena appare nel gioco, quindi quando l’energia è a zero, la scena principale si fermerà. Posto un’immagine dei mattoni

Salva e prova se funziona.

Logica Pausa

La procedura per creare la pausa è su per giù analoga a quella fatta fin’ora, ma mentre per il game over l’evento che innesca la procedura (vista precedentemente) è la fine dell’energia, nel caso della pausa è il giocatore a innescare la procedura che sarà come un interruttore tipo on/off.
Seguendo il filo logico è palese che una condizione come quella della pausa vada implementata nella scena principale, non è una regola fissa ma aiuta quando si vuole riprendere lo sviluppo. Seleziona la camera e aggiungi un Sensor Keyboard, scegli una lettera qualsiasi non ha importanza ai fini del tutorial io ho scelto la lettera A, collega il sensore tramite un Controller And ad un’Actuator Scene, in questo caso non voglio scambiare la HUD con la scena della pausa, perché devono comparire entrambe a video, quindi cambia il Mode dell’Actuator da Restart ad Add Overlay Scene e scegli la scena pausa dal menù a tendina. Si lo so che lo stai pensando, si possono aggiungere più scene in overlay, ma bisogna stare attenti a non sovraccaricare troppo il motore. Salva e prova se la scena pausa appare a video. Bene adesso però devo fare in modo che la scena principale si fermi, se no che pausa è, per farlo devo agire attraverso un’altra scena (come spiegato in precedenza). Ci sono vari modi per implementare una logica come questa, in questo semplice caso basterebbe aggiungere una linea di Mattoni nella scena pausa che sospende la scena principale, in modo che quando la pausa è visibile a video il gioco si ferma. Ma questa procedura innesca una problematica che fin’ora non avevo mai affrontato. Intanto andiamo avanti poi vedrai che il problemino si farà avanti da solo, vai alla scena pausa e aggiungi o alla camera o all’oggetto testo la linea di mattoni Always-And-Scene, cambia il Mode nell’Actuator Scene da Restart a Suspend Scene e scegli la scena game. Salva e prova il gioco. Se hai fatto tutto bene quando appare la scritta Pausa il gioco si blocca. Perfetto. E adesso arriva il problemuccio, siccome la scena principale è sospesa non si può eseguire nessun tipo di azioni, proprio perché la scena è congelata, quindi per fare ripartire il gioco bisogna agire da un’altra scena, in questo caso la scena pausa. Aggiungi un Sensor Keyboard e dagli la stessa lettera di quello della scena game, in questo modo si simula un’interruttore perché il giocatore non deve premere un’altro tasto ma sempre lo stesso, collega il sensore tramite un Controller And ad un’Actuator Scene, cambia il Mode in Resume Scene e scegli la scena game. Salva e prova. Avrai notato che la scena riparte ma la scena pausa non va via e non è più possibile rimettere il gioco in pausa, devo eliminare la scena pausa, per farlo ho bisogno di un messaggio dalla scena pausa stessa. Aggiungi un’Actuator Message e collegalo all’ And del Sensor Keyboard e nel Subject scrivi remuv_pausa. Quindi torna alla scena principale e aggiungi un Sensor Message e scrivi il Subject che hai usato nell’Actuator, collegalo tramite un Controller And ad un’Actuator Scene e seleziona il Mode Remove Scene e scegli la scena pausa dal menù a tendina. In questo modo quando il giocatore preme di nuovo il tasto A (nel mio caso) la scena game viene scongelata e in automatico la stessa elimina la pausa, così facendo si crea un loop a modi interruttore. Salva e prova il gioco. Posto delle immagini della logica

Questa è la logica della camera nella scena game

Questa è la logica nella scena pausa che io ho dato all’oggetto testo

Per questo articolo è tutto, nel prossimo articolo abbellirò il gioco con dei pulsanti nelle scene già create, la game over e la pausa, e implementerò una scena iniziale o come spesso viene chiamata una scena menù, come sempre fai pratica per incamerare i concetti o anche per puro divertimento.