Pausa? Sviluppiamola!

Pausa? Sviluppiamola!

Introduzione

Credo che la funzionalità di pausa, all'interno di un gioco, sia uno degli elementi più bistrattati: se non impostiamo il progetto in una certa maniera, a volte è difficile implementarla a posteriori, e questo fa sì che si porti a tralasciarla completamente.

La soluzione che vi propongo oggi è molto semplice nella realizzazione e, volendo, è possibile implementarla in un prodotto già completo (con le dovute eccezioni, che tratterò a fine articolo).

Ringrazio in particolar modo AlexoFalco, Xeryan e Tiz della community GMI per avermi aiutato con la realizzazione dell'articolo.

Sviluppiamo!

Cominciamo creando un oggetto obj_pause. Tutta la logica finirà qui dentro.

Spostiamoci ora nel suo Create Event e inizializziamo la variabile pause a false.

Ora mettiamo un po' di carne al fuoco:

Quando premiamo il tasto Invio, la variabile pause passa ad essere il suo opposto. A questo punto, se pause == true tutte le istanze del gioco verranno disattivate, altrimenti verranno riattivate.

Ma cosa significa disattivare un'instanza? Come dice il manuale, praticamente le istanze smettono di esistere, a meno di un puntatore in memoria che ricorda il loro stato per quando andremo a riattivarle: di fatto il risultato è che non vedremo più nessun oggetto in gioco, a meno di non ripremere il tasto Invio. Insomma... abbiamo messo in pausa il gioco!

Il parametro booleano di instance_deactivate_all(notme) permette, se settata a true, di mantenere attiva l'instanza che ha usato la funzione: è quello che serve a noi, altrimenti non riusciremmo più a disattivare la pausa.

Mettiamo ora nel Draw GUI Event un testo per indicare che la pausa è attiva e abbiamo concluso

Un ulteriore step

Possiamo rendere la nostra pausa più accattivante mettendo il fermo immagine del gioco invece di mostrare uno schermo praticamente vuoto.

Inizializziamo nel Create Event la variabile spr_view a -1.

Modifichiamo ora lo Step Event così

Abbiamo così salvato, all'interno della variabile appena inizializzata, la copia dell'application_surface, che è la surface di default sul quale GM disegna tutto. Praticamente abbiamo salvato uno "screenshot" del nostro gioco all'interno della nostra variabile.

Gli altri parametri servono ad indicarne la dimensione (e qui prendo solo quanto presente nella viewport, ciò che è al di fuori sarebbe inutile), la posizione (0,0) e se va reso trasparente oppure no (false, quindi no).

Non ci resta che disegnarlo nel Draw GUI Event.

Ed ecco qui il risultato finale:

Limiti

Come avrete notato, la funzione che andiamo ad utilizzare per "bloccare" gli elementi in gioco è instance_deactivactivate_all(notme) e, come dice il suo nome, interviene solo sulle istanze.

Come ci fa notare il buon Tiz, questa soluzione non può essere utilizzata quando vengono usate funzionalità non legate ad istanze, ad esempio:

  • musiche in loop
  • timeline
  • call_later
  • particles

In questi casi bisogna pensare, se si vuole usare comunque la funzione sopracitata, a come stoppare le singole entità. Ci torneremo più avanti, stay tuned.