3. Aggiungiamo più livelli
2024-04-05
//Riccardo Sacchetto
//3 min read
Qual è lo scopo di raccogliere tutte quelle monete se non ci sono nuovi livelli in cui proseguire la nostra avventura?
In questo capitolo scopriremo come caricare una nuova mappa quando il giocatore ha raccolto tutte le monete della precedente. Nota che puoi mettere in pratica quello che leggi qui per passare al livello successivo quando raggiungi un cartello "Exit" o qualche altro obiettivo a tua scelta.
Modifichiamo il nostro gioco
Parti dal codice del capitolo precedente e inserisci queste modifiche. Se fatichi a orientarti, in fondo alla pagina trovi l'esempio completo su cui puoi basarti per capire dove mettere le mani.
Iniziamo:
Spiegazione passo per passo
-
All'interno della funzione
__init__della tua classe di gioco dichiara una nuova variabileself.level:self.level = 0- Al suo interno ci annoteremo a quale livello siamo arrivatri in modo da essere sicuri di caricare sempre la mappa corretta
-
Subito dopo la init aggiungi questa nuova funzione:
def load_level(self): if self.level == 0: map_name = ":resources:tiled_maps/map2_level_1.json" self.load_map(map_name) elif self.level == 1: map_name = ":resources:tiled_maps/map2_level_2.json" self.load_map(map_name)- Questa funzione appena
definita si occuperà di caricare una mappa diversa in funzione (ha!) del livello che abbiamo raggiunto - Nota infatti che al suo interno vengono eseguiti comandi diversi a seconda (
if) che il livello sia 0 (self.level == 0) oppure (elif, contrattura dielse if) 1 - La tecnica utile a caricare efettivamente la mappa è la stessa vista nei passaggi precedenti: prima salviamo il percorso al file JSON della mappa in una variabile, poi utilizziamo questo per eseguire il caricamento vero e proprio con la funzione
load_map
- Questa funzione appena
-
A questo punto, visto che abbiamo scritto una nuova logica di caricamento della mappa, rimuoviamo dalla funzione
setup_hookle righemap_name = ":resources:tiled_maps/map.json" self.load_map(map_name)e rimpiazziamole con
self.load_level()- Nota che all'avvio la variabile
self.levelsarà uguale a 0 (l'abbiamo definita così nella init!); di conseguenza, chiamareload_levelnel setup hook non farà altro che caricare il livello 0 - La ragione dell'utilizzo di questa funzione anche in questo punto risiede nel tentativo di scongiurare duplicati dello stesso codice, onde evitare di generare errori a fronte di una modifica futura (ad esempio, aggiornando solo una delle due parti dove questo compare)
- Nota che all'avvio la variabile
-
Infine, non ci resta che aggiungere un paio di righe in fondo all'
update_hook:if not self.scene["Coins"]: self.level += 1 self.load_level()- Qui diciamo al gioco che, se (
if) non rimangono (not) più monete ("Coins") nella scena (self.scene) dobbiamo:- Incrementare di 1 (
+= 1) il livello (self.level) per passare al successivo - Chiamare la funzione
load_levelper effettuare il caricamento vero e proprio di quest'ultimo
- Incrementare di 1 (
- Nota che, qualora dovessimo esaurire tutte le monete anche nell'ultimo livello da noi sviluppato (nel nostro caso, il 2),
self.levelpasserà al successivo, maload_level, non avendo nessuna istruzione per questo caso, si limiterà a non fare nulla
- Qui diciamo al gioco che, se (
Riassumendo
Ecco il nostro esempio completo:
import arcade
from platformer.platformer_base import PlatformerBase
class Platformer(PlatformerBase):
def __init__(self):
super().__init__()
self.collect_coin_sound = arcade.load_sound(":resources:sounds/coin1.wav")
self.level = 0
def load_level(self):
if self.level == 0:
map_name = ":resources:tiled_maps/map2_level_1.json"
self.load_map(map_name)
elif self.level == 1:
map_name = ":resources:tiled_maps/map2_level_2.json"
self.load_map(map_name)
def setup_hook(self):
image_source = ":resources:images/animated_characters/female_adventurer/femaleAdventurer_idle.png"
self.set_player(image_source)
self.load_level()
def update_hook(self):
coin_hit_list = arcade.check_for_collision_with_list(
self.player_sprite, self.scene["Coins"]
)
for coin in coin_hit_list:
coin.remove_from_sprite_lists()
arcade.play_sound(self.collect_coin_sound)
if not self.scene["Coins"]:
self.level += 1
self.load_level()
def main():
Platformer.startup()
if __name__ == "__main__":
main()
Se tutto è andato a buon fine, dovresti riuscire a passare al livello successivo non appena raccolto tutte le monete del precedente.
Challenge!
Se sei riuscito a introdurre il tuo secondo livello, complimenti!
Prenditi ora un paio di minuti per rileggere il codice che hai scritto e per assicurarti di aver capito tutto, poi prova a fare queste personalizzazioni:
- Aggiungi un terzo livello al gioco, caricando un'altra delle mappe disponibili tra gli asset predefiniti;
- Riproduci un suono quando il giocatore riesce a passare da un livello a un altro.