È giunto finalmente il momento: abbiamo quasi terminato il nostro gioco e siamo pronti a implementare la meccanica del gameplay finale. Questo articolo si concentrerà sulla creazione di un sistema combinato che dà al giocatore più punti per la creazione di catene che distruggono più gruppi di blocchi dopo un solo scambio.
Inoltre, implementeremo lo scenario di perdita e aggiungeremo una schermata Game Over. Infine, parlerò delle cose su cui puoi lavorare nel tuo tempo per migliorare ed espandere il gioco al di là di ciò che abbiamo trattato. Quindi, senza ulteriori indugi, iniziamo ...
Ecco una demo del gioco a cui stiamo lavorando e che avremo costruito alla fine di questa parte della serie:
Prima di passare all'articolo principale, voglio fare una piccola modifica a quando FindMatches
viene chiamato.
Mentre lavoravo a questo articolo, ho scoperto un problema che puoi vedere nella GIF di seguito:
Come puoi vedere in questa prima GIF, quando un blocco viene rilasciato a una distanza di solo un isolato per provare a formare una corrispondenza con un gruppo di blocchi in fondo alla caduta, funziona perfettamente.
In questo secondo GIF, tuttavia, diventa chiaro che quando un blocco viene rilasciato a una distanza maggiore nello stesso scenario, non riesce a rilevare la corrispondenza finché non eseguiamo un altro scambio. La ragione di questo è che il gioco non è alla ricerca di partite abbastanza spesso.
In questo momento, il gioco cerca le partite solo dopo uno scambio, ma a causa del tempo necessario a bloccare un Blocco per questa distanza, il rilevamento della partita è già terminato quando il Blocco tocca terra e quindi la partita non viene trovata fino a quando è riavviato.
Per risolvere questo problema, modificheremo quando eseguiremo a FindMatches
dai un'occhiata.
Prima vai al SwapBlocks
funzione e rimuove l'Evento finale dalla funzione in modo che non chiami FindMatches
affatto.
SwapBlocks
dovrebbe assomigliare a questo ora:
A questo punto, non vi è alcuna chiamata di evento FindMatches
. Provvederemo a risolvere questo problema aggiungendo una nuova azione all'evento che rileva quando sono possibili le partite. Trova questo evento e aggiungi questa azione alla fine dell'evento Else:
Azione: Funzione> Funzione chiamata Nome = "FindMatches"
Il tuo evento dovrebbe ora assomigliare a questo:
Inoltre, cogli l'occasione per spostare entrambi MatchesPossible
Eventi alla fine del codice del gioco, se non l'hai già fatto. Fare ciò assicurerà che non vengano chiamati prima del codice che elimina le partite pre-create.
Se si esegue il gioco ora, si dovrebbe essere in grado di eseguire lo scenario che ho presentato sopra senza problemi.
Con questo problema risolto, implementeremo il concatenamento sistema, che fornisce al giocatore punti extra per le partite che sono causate dalla distruzione di un'altra partita.
Puoi vedere un esempio del tipo di situazione che intendo di seguito:
Nello scenario sopra, il giocatore sposta il blocco verde e crea una corrispondenza. Quindi, la distruzione dei blocchi verdi fa cadere i blocchi blu e crea un altro incontro più tardi.
Voglio dare al giocatore punti bonus per ottenere qualcosa del genere. In particolare, voglio applicare un moltiplicatore al numero di punti che il giocatore riceve per ogni partita e aumentare il moltiplicatore con ogni partita consecutiva che viene fatta.
Per far funzionare questo sistema, creeremo una nuova variabile chiamata Catena
, e quindi apportare alcune piccole modifiche a una delle funzioni esistenti. Quindi, prima crea una nuova variabile globale:
Variabile globale: Tipo di catena = Numero Valore iniziale = 0
La tua variabile dovrebbe apparire così:
Questa variabile agirà come un moltiplicatore per i punti per indicare per quanto tempo una catena sta andando.
Ora vai all'Evento che fa cadere i blocchi e rimuovi l'Evento Else che chiama il FindMatches
funzione.
Ora vai a FindMatches
stesso e trovare i luoghi in cui si effettua il FloatingPointsText
oggetti. Modifica le istruzioni Set Text in modo che utilizzino una nuova formula:
Azione: FloatingPointsText> Imposta testo Text = NumMatchesFound * 10 * Chain
Questa modifica rende il testo fluttuante modificato nello stesso modo in cui lo faranno i Punti stessi.
Quindi, vai alla sezione di FindMatches
dove chiami FindMatches
di nuovo alla fine dell'evento ed eliminare questa chiamata di funzione e l'istruzione Wait. Perché? Perché, se non li avessimo rimossi, allora FindMatches
finirebbe per essere chiamato troppe volte e le catene non sarebbero mai state avviate correttamente.
(A causa delle modifiche apportate in precedenza in questo articolo, FindMatches
sarà chiamato ogni volta che tutti i blocchi sono nella griglia e nessuno sta cadendo. Avere più aree in cui chiamiamo FindMatches
causerebbe solo più istanze della funzione in esecuzione contemporaneamente e potrebbe compromettere il sistema dei punti).
Infine, faremo un'altra modifica a questa funzione. Vai alla fine della funzione e aggiungi questa azione dopo aver impostato PointsGiven
a 0
:
Azione: Sistema> Aggiungi a Variabile = Valore "Catena" = 1
Ora, ogni volta che il gioco trova le partite, dà i punti giocatore, distrugge i blocchi, e quindi aumenta il valore della catena.
La nuova versione di FindMatches
dovrebbe assomigliare a questo:
Quindi, vai al GivePoints
funzione e modifica entrambe le azioni che aumentano il valore del punteggio in modo che tengano conto del valore della catena:
Azione: Sistema> Aggiungi a variabile = Valore punteggio = 10 * Catena
Con questo cambiamento, GivePoints
ora dovrebbe assomigliare a questo:
Abbiamo implementato la variabile Chain come moltiplicatore per i punti che il giocatore sta ricevendo (e il numero di punti che vengono visualizzati negli oggetti di testo mobili), ma c'è ancora una cosa che dobbiamo fare: dobbiamo aggiungere una dichiarazione che ripristina il valore di Chain in modo che non aumenti solo all'infinito.
Aggiungeremo questa dichiarazione al Su DragDrop Start Evento in modo che, ogni volta che il giocatore inizia a trascinare un nuovo Blocco, viene considerato come una nuova Catena. L'altro motivo per cui lo stiamo facendo qui è perché impedisce il reset prematuro del valore Chain, rendendo così meno preziose tutte le corrispondenze nell'ultima parte di una catena..
Vai al Su DragDrop Start Evento e aggiungere questa azione all'elenco Azioni:
Azione: Sistema> Imposta valore Variabile = Valore catena = 1
Il tuo evento dovrebbe ora assomigliare a questo:
Se testi il gioco a questo punto dovresti vedere che se fai una catena come quella che ho dimostrato nella gif in precedenza, ricevi 90 punti invece di 60 punti.
Con questo funzionamento, il sistema di concatenamento è completo e dovresti essere in grado di creare una catena elaborata come vuoi senza problemi.
La prossima cosa che voglio riguardare è un problema che ho riscontrato con il sistema di caduta dei blocchi. Se passi una grande quantità di tempo a giocare al nostro gioco Match-3 nel suo stato attuale, potresti aver notato un problema in cui, di tanto in tanto, un Blocco non cade, anche se non ci sono blocchi sotto di esso.
Puoi vedere cosa intendo nell'immagine qui sotto:
Nonostante non ci sia alcun Blocco sotto il Blocco giallo, non è ancora riuscito a cadere nello spazio vuoto. Questo è un problema raro, ma se non è affrontato potrebbe ancora rovinare il punteggio di qualcuno e impedire loro di ricevere una catena che hanno impostato, o addirittura farli perdere una volta aggiunta la funzione Game Over.
Il problema deriva dalla variabile BlockBeingMoved
, che viene utilizzato dall'evento che determina quando i blocchi devono cadere per assicurarsi che non ci siano blocchi spostati quando dice a un blocco di riempire uno spazio vuoto. In alcuni scenari, quando il giocatore muove un blocco, questa variabile non si reimposta mai ei blocchi non cadono finché non viene spostato un altro blocco e esso viene reimpostato correttamente. Per risolvere questo problema, aggiungeremo una coppia di eventi che imposterà e ripristinerà correttamente questa variabile e rimuoveremo le azioni correnti che impostano la variabile, poiché non funzionano correttamente.
Per prima cosa, vai al OnDragDrop Start
e In DropDrop Drop
Eventi e rimuovi tutte le azioni che gestiscono il BlockBeingMoved
variabile da questi eventi. Ci dovrebbe essere una azione in ogni evento che deve essere cancellato.
Quindi, vai all'Evento che rileva quando c'è uno spazio vuoto sotto un Blocco. Stiamo andando a modificare le condizioni di questo evento. Innanzitutto assicurati che la Condizione che controlla se BlockBeingMoved
è uguale a 0
è all'inizio Quindi, aggiungi un'altra condizione alla fine dell'Evento che verifica che non vengano spostati i blocchi.
Questa è la condizione che aggiungerai:
Condizione: Inverti: Blocca> Sta trascinando
Il tuo evento dovrebbe ora assomigliare a questo:
Infine, aggiungeremo altri due eventi alla fine del Scheda evento che gestirà il BlockBeingMoved
variabile. Vai alla fine del tuo Scheda evento e aggiungi questi eventi:
Evento: Condizione: Blocco> Sta trascinando Azione: Sistema> Imposta variabile Nome = Valore BlockBeingMoved = 1
Evento: Condizione: Sistema> Altrimenti Azione: Sistema> Imposta variabile Nome = Valore BlockBeingMoved = 0
I tuoi nuovi eventi dovrebbero assomigliare a questo:
Questi eventi cambieranno in modo efficace BlockBeingMoved
a partire dal 0
a 1
e da 1
a 0
ogni volta che un blocco viene spostato o è non spostati, rispettivamente. Se testi il gioco a questo punto, dovresti essere in grado di giocare tutte le volte che vuoi senza incontrare problemi con la caduta di Blocco.
Ora che il nostro sistema di concatenamento è a posto, aggiungeremo lo scenario di perdita e una schermata Game Over.
La prima cosa che dobbiamo fare è aggiungere un nuovo Layout che fungerà da schermata Game Over:
-6, -7
.613, 619
.303, 200
.RestartButton
.262, 410
.100, 30
.Ricomincia
.Ora che hai impostato la schermata Game Over, torna al layout originale, Layout 1, e aggiungi un nuovo elemento a quello schermo:
GameOverArea
.196, -30
.344, 150
.0
.Dovresti notare che questo sprite si trova nella stessa posizione e nella stessa dimensione della parte superiore del campo di gioco. Useremo questo oggetto sprite per rilevare quando il giocatore ha perso rilevando quando un blocco si scontra con esso. Vai a Scheda evento 1 quindi possiamo iniziare a implementarlo.
Prima di iniziare a rilevare lo scenario di perdita, dobbiamo aggiungere una nuova variabile che useremo per fermare i blocchi quando colpiscono il GameOverArea oggetto in modo che non si muovano più. Questo renderà chiaro al giocatore che hanno perso.
Variabile globale: MovementPossible Type = Number Initial Value = 0
Ora vai all'Evento in cui muovi i blocchi e aggiungi questa condizione:
Condizione: Sistema> Confronta variabile Variabile = MovimentoPossibile Confronto = Uguale a Valore = 0
L'evento del tuo movimento dovrebbe ora assomigliare a questo:
Ora che il movimento utilizza la nostra nuova variabile, aggiungeremo l'evento che rileva la condizione di perdita:
Evento: Condizione: Blocco> Si sovrappone a un altro oggetto Object = GameOverArea Condizione: Inverti: Blocca> IsDragging Azione: Funzione> Call Function Name = "Game Over"
L'evento appena creato chiamerà la funzione Game Over una volta che un blocco si sovrappone al GameOverArea
. Ora faremo effettivamente il Gioco finito
funzione.
Evento: Condizione: Funzione> On function Name = "Game Over" Azione: Block> Set enabled Stato = Disabled Azione: System> Imposta valore Variable = MovementPossible Value = 1 Azione: System> Wait seconds = 1.5 Azione: System> Vai a Layout Layout = Layout 2
I tuoi due nuovi eventi dovrebbero assomigliare a questo:
Il motivo per cui abbiamo creato una funzione separata invece di eseguire queste azioni all'interno dell'Evento che effettivamente rileva il gioco, è che questo evento sta esaminando determinati blocchi a causa degli eventi che lo attivano. Come puoi vedere nella funzione che abbiamo creato, disabilitiamo le funzioni di trascinamento del blocco per impedire al giocatore di continuare a fare le partite dopo che il gioco è stato scoperto. Se lo facessimo nell'evento che rileva il gioco, disabiliterebbe solo i blocchi che hanno causato il gioco e ogni altro blocco potrebbe ancora essere trascinato.
Ora vai Scheda evento 2; aggiungeremo alcune funzionalità al RestartButton oggetto che abbiamo fatto prima. Aggiungi un nuovo evento a Scheda evento 2:
Evento: Condizione: RestartButton> Su clic su Azione: Sistema> Vai a layout Layout = Layout 1
Il tuo evento dovrebbe assomigliare a questo:
Se giochi ora, prendi un gioco e poi riavvia, dovresti notare che torna al layout originale, ma i blocchi non si muovono. La ragione di ciò è che tutte le variabili che abbiamo usato sono variabili globali, quindi alcune di esse non vengono automaticamente ripristinate quando riavviamo il layout.
Per resettarli, dobbiamo aggiungere un'azione al nostro All'inizio del layout Evento che li ripristinerà manualmente per noi.
Vai al All'inizio del layout Evento e aggiungi questa azione all'evento iniziale prima che i loop For vengano chiamati:
Azione: Sistema> Ripristina variabili globali
Il tuo evento dovrebbe ora assomigliare a questo:
Se esegui nuovamente il test, non dovresti più avere questo problema.
A questo punto, abbiamo esaminato tutte le funzionalità che volevo includere nell'ambito di queste esercitazioni.
Noterai che il tuo gioco continua a non esserlo Esattamente lo stesso di quello nella demo sopra, con la più grande differenza che il tuo gioco non ha una schermata Start. Ho scelto di non andare oltre la creazione della schermata Start, dal momento che è quasi la stessa cosa della creazione dello schermo Game Over - Lascio questo come esercizio per te.
Invece, ho intenzione di discutere alcune funzionalità che potresti considerare di aggiungere al tuo gioco che potrebbero renderlo migliore o più interessante.
La prima cosa di cui voglio parlare sono i blocchi speciali, blocchi che danno ai giocatori bonus o svolgono una funzione unica.
La maggior parte dei giochi di combinazione a 3 include blocchi speciali per aiutare a spezzare l'azione e rendere il gioco più eccitante. Così com'è, il gioco può teoricamente andare avanti all'infinito, ma il gameplay non cambia mai. L'introduzione di tipi di blocchi speciali di tanto in tanto può aiutare a rendere il gioco più interessante quando è in corso da un po 'di tempo.
Per integrare un blocco di specialità è necessario cambiare il modo in cui i blocchi vengono generati, in modo che ogni volta che viene creato un blocco ci sia una possibilità casuale che diventi un blocco di specialità. Ci sono diversi modi per farlo, ma generalmente è meglio generare un numero casuale compreso tra 1 e 100 e generare solo un blocco speciale quando il valore casuale è compreso tra 95 e 100 o qualche altro intervallo che decidi.
Il tuo obiettivo dovrebbe essere quello di rendere i blocchi speciali rari, ma non lo sono pure raro. In questo modo, il giocatore li otterrà regolarmente abbastanza per rendere il gioco più divertente, ma non così spesso da distruggere l'equilibrio del gioco.
Quando si tratta di blocchi speciali hai molte opzioni; uno dei più comuni è a blocco di bombe.
I blocchi di bombe fanno sì che i blocchi aggiuntivi vengano distrutti quando vengono distrutti. Sono diversi in ogni gioco: in alcuni giochi, distruggono tutti i blocchi che li circondano; in altri, distruggono un'intera riga o colonna di Blocchi.
Nell'immagine sottostante, puoi vedere due dei tipi di blocchi di bombe del gioco popolare Candy Crush Saga:
I blocchi bomba sono in genere abbastanza semplici da integrare:
Un altro tipo di blocco di specialità che troverai in molti giochi è quello che rallenta la velocità con cui i Blocchi si muovono o li ferma completamente.
Blocchi come questi sono molto semplici da realizzare.
MovementsPossible
a 1
in modo che i blocchi si fermino o modificino il velocità
in modo che i blocchi si muovano molto lentamente.È necessario ricordare di considerare il giocatore che attiva un blocco temporale mentre un altro blocco temporale è già attivo. In questo scenario, è necessario riavviare il timer o aggiungere la durata standard del timer al timer esistente e continuare normalmente.
Potresti anche prendere in considerazione l'aggiunta di altre modalità di gioco per quando il giocatore si annoia della modalità Endless che abbiamo creato.
La modalità di gioco più semplice da aggiungere è quella in cui il giocatore ha un limite di tempo, con l'obiettivo di ottenere più punti possibile prima che scada il tempo.
In questo scenario, lascerai intatto tutto il codice del gioco tranne che per aggiungere una seconda condizione di perdita al gioco, per cui il gioco termina quando il tempo scade (così come quando i blocchi colpiscono la parte superiore dello schermo).
Quando inizia il gioco, inizierai un timer per il tempo che dura la modalità, e quando finirà il timer finirai il gioco nello stesso modo in cui lo farai ora.
In questa modalità di gioco daresti al giocatore una plancia di gioco molto specifica che hai progettato in anticipo e chiedi loro di eliminare tutti i blocchi nel minor numero possibile di scambi.
(Probabilmente vorrai disattivare il movimento del blocco, poiché se i blocchi si spostano ci saranno anche nuovi blocchi aggiunti nel tempo.)
Questa modalità richiederebbe di essere in grado di impostare una griglia di blocco specifica, quindi è necessario disporre di un sistema che ti permetta di passare in una specifica configurazione di blocco all'avvio del gioco piuttosto che generarne uno completamente casuale, come facciamo ora.
Oltre a questo, mentre questa modalità di gioco sarebbe relativamente facile da implementare, richiederebbe un sacco di disegni a puzzle manuali in modo da poter creare un sacco di puzzle unici per il giocatore da provare e risolvere.
L'aggiunta di una modalità di gioco come questa può richiedere parecchio tempo a causa di tutta la creazione di contenuti richiesta, ma ci sono molti giocatori che si divertiranno. Può davvero pagare bene se si inserisce il tempo.
Nel corso di questa serie di tutorial, abbiamo creato un'intera partita di match-3 dall'inizio alla fine. C'è molto di più che puoi fare con questo gioco se ti prendi il tempo e hai l'immaginazione, ma ci sono anche molti modi in cui puoi usare le idee che ho presentato per aiutarti con altri progetti di gioco.
Continua a lavorare sul tuo gioco e continua ad esplorare nuove idee, perché non sai mai quando qualcosa che hai imparato qui potrebbe tornarti utile più tardi.
Spero che, sia che abbiate passato tutta la serie o semplicemente saltato attorno alle parti che non siete stati in grado di fare da soli, avete imparato qualcosa da questo. Se hai problemi o commenti, faccelo sapere nelle discussioni seguenti ogni articolo: mi piacerebbe sentirti e vedere quali colpi di scena aggiungerai. In ogni caso, grazie per la lettura e buona fortuna con i tuoi giochi!