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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
imm_sfondo = "introduzione.jpg" mouse = "puntatore.png" import pygame from pygame.locals import * from sys import exit pygame.mixer.pre_init(44100, 16, 2, 4096) pygame.init() screen = pygame.display.set_mode((640,480), DOUBLEBUF | HWSURFACE, 32) pygame.display.set_caption("Input Vari") sfondo = pygame.image.load(imm_sfondo).convert() puntatore = pygame.image.load(mouse).convert_alpha() speed = 0.5 orologio = pygame.time.Clock() tasto_start = pygame.Rect((200,100),(200,200)) controller = None if pygame.joystick.get_count() > 0: controller = pygame.joystick.Joystick(0) controller.init() if controller is None: print ("Siamo spiacenti, ma hai bisogno di un joystick con almeno 10 tasti!") x , y = 0,0 move_x, move_y = 0,0 applausi = pygame.mixer.Sound("applause-2.wav") click = pygame.mixer.Sound("beep-3.wav") click2 = pygame.mixer.Sound("beep-6.wav") pygame.mixer.music.load("Relocation.mp3") playmusica = True volume_musica = 1.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() if tasti_premuti[K_LALT] and tasti_premuti[K_F4]: exit() if event.key == K_UP: move_y = -1 if event.key == K_DOWN: move_y = 1 if event.key == K_LEFT: move_x = -1 if event.key == K_RIGHT: move_x = 1 if event.key == K_m: if playmusica: playmusica = False else: playmusica = True if event.key == K_KP_PLUS: if volume_musica < (1.0) and pygame.mixer.music.get_busy()==True: volume_musica += 0.1 pygame.mixer.music.set_volume(volume_musica) if event.key == K_KP_MINUS: if volume_musica > (0.0) and pygame.mixer.music.get_busy()==True: volume_musica -= 0.1 pygame.mixer.music.set_volume(volume_musica) elif event.type == KEYUP: if event.key == K_UP: move_y = 0 if event.key == K_DOWN: move_y = 0 if event.key == K_LEFT: move_x = 0 if event.key == K_RIGHT: move_x = 0 pulsanti_mouse = pygame.mouse.get_pressed() if pulsanti_mouse[0]==1: coordinate_mouse_attuali = pygame.mouse.get_pos() canaleclick = click.play() canaleclick.set_volume( 1.0 - (coordinate_mouse_attuali[0]/640.) , coordinate_mouse_attuali[0]/640.) if imm_sfondo == "introduzione.jpg": if tasto_start.collidepoint(coordinate_mouse_attuali): canaleapp = applausi.play() imm_sfondo = "giocoavviato.jpg" sfondo = pygame.image.load(imm_sfondo).convert() if pulsanti_mouse[2]==1: canaleclick = click2.play() if imm_sfondo == "giocoavviato.jpg": imm_sfondo = "introduzione.jpg" sfondo = pygame.image.load(imm_sfondo).convert() if controller != None and controller.get_button(7): if imm_sfondo == "introduzione.jpg": canaleapp = applausi.play() imm_sfondo = "giocoavviato.jpg" sfondo = pygame.image.load(imm_sfondo).convert() if playmusica == True and pygame.mixer.music.get_busy()==False: pygame.mixer.music.play() if pygame.mixer.music.get_busy()==True and playmusica == False: pygame.mixer.music.stop() pygame.mouse.set_visible(False) coordinate_mouse = pygame.mouse.get_pos() tempo_passato = orologio.tick(60) tempo_passato_sec = tempo_passato/1000.0 distanza_spostamento = tempo_passato*speed x += move_x*distanza_spostamento y += move_y*distanza_spostamento tasto_start.move_ip(move_x*distanza_spostamento,move_y*distanza_spostamento) screen.fill((0,0,0)) screen.blit(sfondo,(x,y)) screen.blit(puntatore,coordinate_mouse) pygame.display.flip() |
1 |
pygame.mixer.pre_init(44100, 16, 2, 4096) |
Come potete notare, il mixer deve essere configurato prima dell’inizializzazioone.
In questo caso passiamo i parametri per gestire un mixer a 44100 Hz, 16 bit stereo e 4096 kb di buffer.
Fatto questo, una volta inizializzato pygame, non ci resta che memorizzare gli effetti sonori da noi utilizzati.
1 2 3 4 5 6 |
applausi = pygame.mixer.Sound("applause-2.wav") click = pygame.mixer.Sound("beep-3.wav") click2 = pygame.mixer.Sound("beep-6.wav") pygame.mixer.music.load("Relocation.mp3") playmusica = True volume_musica = 1.0 |
Da notare come i click e gli applausi sono stati caricati come Sound, mentre la musica viene caricata a parte con pygame.mixer.music.load. Questo perché l’utilizzo è molto diverso e lo vediamo subito nella sezione eventi, dove sono state aggiunte le seguenti righe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if event.key == K_m: if playmusica: playmusica = False else: playmusica = True if event.key == K_KP_PLUS: if volume_musica < (1.0) and pygame.mixer.music.get_busy()==True: volume_musica += 0.1 pygame.mixer.music.set_volume(volume_musica) if event.key == K_KP_MINUS: if volume_musica > (0.0) and pygame.mixer.music.get_busy()==True: volume_musica -= 0.1 pygame.mixer.music.set_volume(volume_musica) |
In questo modo, controlleremo l’esecuzione della musica tramite il tasto “M”, facendo variare semplicemente playmusica. Invece con il tasto “+” e “-” andiamo a controllare se il volume è già al suo massimo, ovvero 1.0, e se la musica viene eseguita, aumentiamo e diminuiamo il volume. Questo controllo del volume viene effettuato solo sulla musica e non riguarda alcun effetto Sound.
1 2 |
canaleclick = click.play() canaleclick.set_volume( 1.0 - (coordinate_mouse_attuali[0]/640.) ,coordinate_mouse_attuali[0]/640.) |
Come potete vedere ora, quando si clicca con il tasto sinistro del mouse viene avviato il suono click nel canaleclick. Canaleclick è proprio un Canale (Channel), poiché viene ritornato dalla funzione play() ed ha varie proprietà che possono essere modificate. Tra queste, ho scelto di modificare il volume. In poche parole, a seconda di dove pigiamo sulla schermata del nostro gioco, sentiremo il click sul canale destro o sinistro. Per fare questo, aggiorno tramite le coordinate del mouse il volume del canale dove viene riprodotto click. Vi ricordo che il volume è un valore float che va da 0.0 a 1.0 ed è per questo che divido per 640, visto che è la larghezza massima della nostra finestra. Si può notare subito la differenza con il click del tasto destro, sia nel codice che avviando il programma, poiché nel click destro del mouse c’è solo la seguente riga:
1 |
canaleclick = click2.play() |
Per quanto riguarda gli applausi, sono solo disponibili quando si preme su start e si passa al gioco avviato:
1 2 3 4 5 |
if imm_sfondo == "introduzione.jpg": if tasto_start.collidepoint(coordinate_mouse_attuali): canaleapp = applausi.play() imm_sfondo = "giocoavviato.jpg" sfondo = pygame.image.load(imm_sfondo).convert() |
Il metodo play accetta anche più parametri. Quelli che vi possono servire sono i primi due, ovvero loop e maxtime. Se indicate un numero maggiore di zero, il suono verrà eseguito una volta e poi n volte il numero da voi passato. Se invece volete ripetere un suono all’infinito ma lo volete limitare nel tempo, dovete solo fare come segue (il tempo è indicato in millisecondi):
1 |
canale = laser.play(-1, 5000) |
Naturalmente il suono applausi è stato aggiunto anche nelle righe che riguarda la pressione del tasto start del joystick.
Per concludere, dobbiamo gestire lo scorrere della musica nel loop principale del gioco:
1 2 3 4 |
if playmusica == True and pygame.mixer.music.get_busy()==False: pygame.mixer.music.play() if pygame.mixer.music.get_busy()==True and playmusica == False: pygame.mixer.music.stop() |
Così controlliamo se la musica deve essere eseguita o meno. Il metodo pygame.mixer.music.get_busy() serve per vedere se la musica è già in esecuzione; è solo un controllo in più. In questo caso non servirebbe, ma per ovviare ad errori di inizializzazione, meglio controllare che la musica sia realmente in esecuzione. Potete gestire l’esecuzione della musica anche senza la variabile Booleana playmusica.