Sviluppare un gioco in Python : Menù e salvataggi. Quarta Parte.

Introduzione

Quest’ultima parte è tutta in discesa. Le funzioni che elencherò sono basilari, ma anche di facile intuizione. Vi prego di non badare troppo alle ottimizzazioni possibili che non ho effettuato (questo non vuol dire che non potete suggerirle :D), perché il mio intento principale è, in questa guida, mostrare come memorizzare facilmente delle informazioni proprie e trattarle a seconda dei gusti personali di chi programma.

Codice

1#################################
2#Funzione che gestisce gli eventi
3def Eventi(event, Main):
4 
5    if event.type == QUIT:
6        exit()
7 
8    tasti_premuti = pygame.key.get_pressed()
9    pulsanti_mouse = pygame.mouse.get_pressed()
10 
11    if event.type == KEYDOWN :
12        if tasti_premuti[K_ESCAPE]:
13            Main.action_esc()
14        elif tasti_premuti[K_LALT] and tasti_premuti[K_F4]:
15            exit()
16        elif tasti_premuti[K_DOWN]:
17            Main.action_p("basso",0)
18        elif tasti_premuti[K_UP]:
19            Main.action_p("alto",12)
20        elif tasti_premuti[K_RIGHT]:
21            Main.action_p("destra",8)
22        elif tasti_premuti[K_LEFT]:
23            Main.action_p("sinistra",4)
24 
25    if event.type == MOUSEBUTTONDOWN:
26        if pulsanti_mouse[0]==1:
27            coordinate_mouse = pygame.mouse.get_pos()
28            Main.action(coordinate_mouse)
29 
30#########################################################################################
31# Funzione per il caricamento delle impostazioni. File : impostazioni.pkl; ritorna screen
32def caricamento_imp():
33    try:
34        stream = open("data/impostazioni.pkl", "r")
35        pk = cPickle.Unpickler(stream)
36        imp = pk.load()
37        stream.close()
38        pygame.mixer.pre_init(imp.frequenza, imp.dimensione, imp.canali, imp.buffer)
39        pygame.init()
40        if imp.full == False and imp.bool_buff == False and imp.bool_hw == False and imp.bool_opengl == False:
41            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo))
42        elif imp.full == False and imp.bool_buff == False and imp.bool_hw == False and imp.bool_opengl == True:
43            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),OPENGL,imp.depth)
44        elif imp.full == False and imp.bool_buff == False and imp.bool_hw == True and imp.bool_opengl == False:
45            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),HWSURFACE,imp.depth)
46        elif imp.full == True and imp.bool_buff == False and imp.bool_hw == True and imp.bool_opengl == False:
47            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),FULLSCREEN | HWSURFACE,imp.depth)
48        elif imp.full == False and imp.bool_buff == True and imp.bool_hw == True and imp.bool_opengl == False:
49            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),DOUBLEBUF | HWSURFACE,imp.depth)
50        elif imp.full == True and imp.bool_buff == True and imp.bool_hw == True and imp.bool_opengl == False:
51            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),FULLSCREEN | DOUBLEBUF | HWSURFACE,imp.depth)
52        elif imp.full == True and imp.bool_buff == False and imp.bool_hw == False and imp.bool_opengl == False:
53            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),FULLSCREEN,imp.depth)
54        elif imp.full == True and imp.bool_buff == True and imp.bool_hw == False and imp.bool_opengl == True:
55            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),FULLSCREEN | DOUBLEBUF | OPENGL,imp.depth)
56        elif imp.full == False and imp.bool_buff == True and imp.bool_hw == False and imp.bool_opengl == True:
57            screen = pygame.display.set_mode((imp.larghezza_schermo, imp.altezza_schermo),DOUBLEBUF | OPENGL,imp.depth)
58 
59        return screen
60 
61    except IOError:
62        print ("Impossibile inizializzare Pygame")
63        exit()
64 
65#########################################################################
66# Funzione per il salvataggio delle impostazioni. File : impostazioni.pkl
67def salvataggio_imp():
68        try:
69                stream = open("data/impostazioni.pkl", "w")
70                pk = cPickle.Pickler(stream)
71                imp = impostazioni()
72                pk.dump(imp)
73                stream.close()
74                pk.clear_memo()
75 
76        except IOError:
77                print ("Impossibile creare file di configurazione")
78                exit()
79 
80##################################################
81# Funzione che aggiorna le impostazioni di sistema
82def aggiorna_imp(w,h,full,buff,hw,opengl):
83    try:
84        stream = open("data/impostazioni.pkl", "w")
85        pk = cPickle.Pickler(stream)
86        imp = impostazioni()
87        imp.larghezza_schermo = w
88        imp.altezza_schermo = h
89        imp.full = full
90        imp.bool_hw = hw
91        imp.bool_buff = buff
92        imp.bool_opengl = opengl
93        pk.dump(imp)
94        stream.close()
95        pk.clear_memo()
96 
97    except IOError:
98        print ("Impossibile creare file di configurazione")
99        exit()
100 
101def run():
102    try:
103        stream = open("data/impostazioni.pkl", "r")
104    except IOError:
105        salvataggio_imp()
106 
107    Schermo = caricamento_imp()
108    Altezza_s = Schermo.get_height()
109    Larghezza_s = Schermo.get_width()
110    pygame.mouse.set_visible(False)
111 
112    sfondo_erba = pygame.image.load("data/grass3_cyc.jpg").convert()
113    sfondo_erba_scalato = pygame.transform.scale(sfondo_erba, (Larghezza_s,Altezza_s))
114    personaggio = giocatore("27382_1174921384",48,32, (320,240), None)
115 
116    global fps
117    global orologio
118    global tempo_passato
119    global speed
120 
121    speed = 30.0
122    orologio = pygame.time.Clock()
123    fps = 60
124 
125    Ingame = ingame(personaggio, Schermo, sfondo_erba_scalato)
126    Main = main_menu(Schermo, Altezza_s, Larghezza_s, Ingame)
127 
128    pygame.key.set_repeat(100, 30)
129 
130    while (True):
131        for event in pygame.event.get():
132            Eventi(event,Main)
133 
134        tempo_passato = tps(orologio,fps)
135        mouse_x_y = pygame.mouse.get_pos()
136 
137        Main.render(Schermo,tempo_passato,mouse_x_y)
138 
139        pygame.display.flip()
140 
141if __name__ == "__main__":
142    run()

Analisi

  • Eventi

La funzione che gestisce gli eventi dovrà richiamare funzioni presenti all’interno della classe menù. Quindi, in base al tasto premuto, si effettueranno le opportune chiamate, come per esempio ad action_p per muovere il personaggio.

  • Caricamento

La funzione di caricamento delle impostazioni iniziali, inizializza sia il mixer che la libreria pygame, per poi aprire una finestra coerentemente con i flag impostati nel file. Le configurazioni sono molte e questo può essere il modo peggiore per controllarle; comunque sia è il più semplice da capire.

Naturalmente controlliamo se non ci sono errori durante l’apertura del file, perché altrimenti insorgeranno sicuramente dei problemi che non permetteranno l’apertura del gioco.

  • Salvataggio

Il salvataggio memorizza semplicemente il nostro oggetto impostazioni scrivendo il file con cPickle. L’apertura dello stream per la scrittura è sempre controllata.

  • Aggiornamento

L’aggiornamento delle impostazioni è ancora più semplice da capire. Infatti basta leggere il file con cPickle aprendo uno stream e successivamente cambiare i membri dell’oggetto impostazioni salvato. Una volta fatto questo lo sovrascriviamo, cancellando quindi quello che c’era prima nel file e il gioco è fatto.

  • Main

Unica nota nel main è che, inizialmente controlliamo se il file esiste. Infatti non è possibile leggere un file se non esiste e quindi rilascerà un errore; sfruttiamo quindi questa opzione per creare per la prima volta il nostro file impostazioni, che genera una configurazione di base secondo l’inizializzazione della classe che abbiamo già visto negli articoli precedenti.

Per il resto, nella run non ci dovrebbe essere niente di nuovo.

Conclusioni

Con questo ultimo articolo abbiamo visto come salvare le nostre impostazioni, come caricarle e come creare dei salvataggi di gioco. Se il tempo me lo permette, rilascerò oltre ad i sorgenti di questo esempio, anche quelli con le modifiche che apporterò successivamente (aggiornerò i link mano a mano che effettuo i cambiamenti).

Ringrazio tutti per le tante idee che mi avete dato e spero di continuare a scrivere pezzi interessanti e di utilità.

Sorgenti

Press ESC to close