Alcuni mesi fa ho trovato una serie di esempi sul pygame. Qui troverete la versione completa del articolo io postero solamente codice e una breve spiegazione tratta sempre dal articolo originale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
def notrun(screen,x,y): while True: for event in pygame.event.get(): if event.type == QUIT: exit() elif event.type == KEYDOWN: tasti_premuti = pygame.key.get_pressed() if tasti_premuti[K_ESCAPE]: exit() elif tasti_premuti[K_LALT] and tasti_premuti[K_F4]: exit() if tasti_premuti[K_RETURN]: pygame.quit() run() screen.fill((0,0,0)) screen.blit(fine_gioco, (x,y)) pygame.display.flip() def run(): pygame.mixer.pre_init(44100, 16, 2, 4096) pygame.init() pygame.display.set_caption("Sprites") schermo = pygame.display.set_mode((640,480),DOUBLEBUF|HWSURFACE,32) sfondo_erba = pygame.image.load("grass3_cyc.jpg").convert() sfondo_erba_scalato = pygame.transform.scale(sfondo_erba, (640,480)) pygame.mixer.music.load("Relocation.mp3") esplosione1 = oggetto_esplosione("Explode",96,96,(320,340),schermo,8) esplosione2 = oggetto_esplosione("Explode",96,96,(100,200),schermo,8) esplosione3 = oggetto_esplosione("Explode",96,96,(300,100),schermo,8) esplosione4 = oggetto_esplosione("Explode",96,96,(450,50),schermo,8) esplosione5 = oggetto_esplosione("Explode",96,96,(400,300),schermo,8) esplosioni = pygame.sprite.Group() esplosioni.add(esplosione1, esplosione2, esplosione3, esplosione4, esplosione5) personaggio = oggetto_sprite("27382_1174921384",48,32, (320,240),schermo,None,esplosioni) pygame.key.set_repeat(100, 30) global fps global orologio global speed global tempo_passato global ambiente global a_vento global fine_gioco vento = pygame.mixer.Sound("34338__ERH__wind.wav") pioggia = pygame.mixer.Sound("81389__joedeshon__thunder_with_rain_02.wav") ambiente = pygame.mixer.Channel(2) a_vento = pygame.mixer.Channel(3) speed = 30.0 orologio = pygame.time.Clock() fps = 30 mio_font = pygame.font.SysFont('dejavusans.ttf', 100) fine_gioco = mio_font.render("GAME OVER", True, (0,255,0)) while True: for event in pygame.event.get(): if event.type == QUIT: exit() elif event.type == KEYDOWN: tasti_premuti = pygame.key.get_pressed() if tasti_premuti[K_ESCAPE]: exit() elif tasti_premuti[K_LALT] and tasti_premuti[K_F4]: exit() if tasti_premuti[K_DOWN]: personaggio.update("basso",0) if tasti_premuti[K_UP]: personaggio.update("alto",12) if tasti_premuti[K_RIGHT]: personaggio.update("destra",8) if tasti_premuti[K_LEFT]: personaggio.update("sinistra",4) if tasti_premuti[K_m]: if pygame.mixer.music.get_busy() == False: pygame.mixer.music.play() else: pygame.mixer.music.stop() if tasti_premuti[K_SPACE]: if ambiente.get_busy() == False: ambiente = pioggia.play(-1) a_vento = vento.play(-1) else: ambiente.stop() vento.stop() if tasti_premuti[K_RETURN]: esplosioni.update(tempo_passato, "esplodi") elif event.type == KEYUP: tasti_rilasciati = pygame.key.get_pressed() if tasti_rilasciati[K_DOWN]: personaggio.update("stop",0) if tasti_rilasciati[K_UP]: personaggio.update("stop",12) if tasti_rilasciati[K_RIGHT]: personaggio.update("stop",8) if tasti_rilasciati[K_LEFT]: personaggio.update("stop",4) if tasti_rilasciati[K_RETURN]: esplosioni.update(tempo_passato, None) tempo_passato = tps(orologio,fps) schermo.fill((0,0,0)) schermo.blit(sfondo_erba_scalato, (0,0)) personaggio.render() esplosioni.update(tempo_passato, None) pygame.display.flip() |
def notrun:
Quando richiamiamo il fine gioco passiamo lo schermo e le coordinate per il testo “Game Over” che apparirà al centro. Quindi non facciamo niente altro che stampare a video fine_gioco (che contiente la stringa “Game Over” con il font da noi scelto, vedremo come più avanti) e aggiornare lo schermo (dalla linea 16 alla 18).
In questo loop controlliamo anche alcuni eventi da tastiera, ovvero Esc e Alt+F4 per uscire, mentre il tasto Invio servirà per ricominciare il gioco. Da notare che per prima cosa si chiam pygame.quit(), perché tutti i moduli devono essere cancellati e poi si richiama run().
def run:
Per prima cosa si inizializza il mixer e la libreria (linea 22 e 23).
Configuriamo il display (linea 25 e 27).
Alla linea 29 e 30 carichiamo il nostro sfondo e lo convertiamo alla risoluzione dello schermo che abbiamo scelto (in questo caso era necessario perché lo sfondo con l’erba è molto più grande dello schermo creato).
Carichiamo la musica alla linea 32.
Dalla linea 34 alla 41 creiamo le sprites delle bombe e le raggruppriamo in un gruppo sprites. Questo ci consentirà di gestirle al meglio tutte insieme.
Creiamo il nostro personaggio alla linea 43.
Alla linea 45 impostiamo la possibilità di ripetizione dei tasti. Di default non è inizializzata con pygame, quindi bisogna impostare il giusto intervallo per la ripetizione di un singolo tasto. Questo è fondamentale se vogliamo che, tenendo premuto per esempio la freccia destra, il nostro gestore degli eventi non la percepisca come un unica pressione, ma continui a “sentire” l’evento come una ripetizione. In questo modo se teniamo premuto il tasto, il nostro personaggio continuerà a camminare in quella direzione, perché non è arrivato un solo evento di spostamento a destra, ma tanti a seconda dell’intervallo di tempo scelto e dal ritardo rispetto alla prima pressione: pygame.key.set_repeat( ritardo, intervallo). Se la funzione è chiamata senza argomenti, disabilita la ripetizione dei tasti.
Di seguito, dalla linea 47 alla 53, dichiariamo delle variabili globali, che possono essere raggiunte da qualsiasi punto del nostro codice (è una pura comodità).
Carichiamo poi i sounds che riguardano il vento e la pioggia e poi riserviamo due canali per essi (dalla linea 55 alla 59).
Settiamo la velocità di gioco, gli fps che vogliamo raggiungere e creiamo l’orologio di gioco (dalla linea 61 alla 63).
Alla linea 65 memorizziamo un font che scegliamo tra quelli di sistema. Per conoscere i fonts disponibili nel proprio sistema basta utilizzare la funzione pygame.font.get_fonts(), che ritorna una lista di stringhe con i nomi dei fonts utilizzabili. Nel nostro caso, creando un font da quelli di sistema, possiamo passare come nome anche una lista di fonts, cioè una stringa dove essi sono separati da una virgola, per dare al programma più scelte nel caso un font non sia reperibile. L’altro parametro passato è la grandezza.
fine_gioco invece è la nostra stringa renderizzata con il font che abbiamo scelto. In questo caso abbiamo scelto come testo “GAME OVER”, abbiamo settato a True l’antialias sui caratteri della stringa e abbiamo scelto il colore verde (0,255,0). C’è la possibilità di decidere anche il colore dello sfondo, ma se non passato, sarà renderizzato utilizzando il canale alpha e quindi lasciando la trasparenza per visualizzare il background.
Dalla linea 68 inizia il loop principale e subito dopo il controllo degli eventi. Oltre ai soliti tasti per l’uscita del programma, controlliamo le frecce direzionali per far muovere il nostro personaggio. Il tasto ‘M’ si oocuperà di avviare o spegnere la musica si sottofondo, mentre il tasto ‘Spazio’ avvierà i rumori di ambiente. Se premiamo il tasto ‘Invio’, vedremo tutte le sprites delle bombe esplodere.
Dalla riga 122 alla 130 renderizziamo il gioco a video. Quindi teniamo conto del tempo passato, aggiorniamo lo schermo ad un colore unitario prima di stampare altre immagini a video, renderizziamo lo sfondo e successivamente il personaggio. Infine aggiorniamo le esplosioni, che non devono essere visualizzate se non accadono certi eventi, per questo passiamo None alla funzione Update insieme al tempo. Per concludere aggiorniamo lo schermo.
Qui e possibile scaricare il codice completo del programma.