
hace unos dias estube trabajando en unos ejemplos para el uso de Sound del modulo mixer, hice un pequeño ejemplo que simula unos disparos al hacer click con el puntero del mouse, pero el problema es que el sonido suena mucho despues de que se pinta el "disparo".
aqui les dejo el codigo:
- Código: Seleccionar todo
#******************************************************************************
# mixer_sound.py: reproduce musica y sonidos cuando se pulsan los botones del
# mouse.
# teclas Esc y q para salir, tecla enter para pausar/reproducir
# la musica, boton 1 y 3 para los disparos.
#
# TODO: buscar una manera para mejorar la sincronisacion sonido/imagen de los
# disparos.
#******************************************************************************
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("modulo mixer & Sound")
texto = pygame.font.Font(None, 24)
pygame.mixer.pre_init(44100, -16, 1024)
# creamos una lista para guardar las posiciones de los disparos
disparos = []
pygame.mixer.music.load("moh.ogg")
# cargamos estos efectos de sonido
pistola = pygame.mixer.Sound("pistol.ogg")
shotgun = pygame.mixer.Sound("shotgun.ogg")
tiempo = pygame.time.Clock()
quit = False
pause = False
# reproducimos la musica de fondo
pygame.mixer.music.play(-1)
while not quit:
tiempo.tick(120)
for evento in pygame.event.get():
if evento.type == QUIT:
quit = True
elif evento.type == pygame.KEYDOWN:
if evento.key in [pygame.K_q, pygame.K_ESCAPE]:
quit = True
elif evento.key == pygame.K_RETURN:
if not pause:
pygame.mixer.music.pause()
pause = True
else:
pygame.mixer.music.unpause()
pause = False
elif evento.type == pygame.MOUSEBUTTONDOWN:
if evento.button == 1:
pistola.play()
posicion = [evento.button, evento.pos]
if not posicion in disparos:
disparos.append(posicion)
else:
print "disparo en el mismo lugar!! lol"
elif evento.button == 3:
shotgun.play()
posicion = [evento.button, evento.pos]
if not posicion in disparos:
disparos.append(posicion)
else:
print "escopetazo en el mismo sitio! lol"
screen.fill((0,0,0))
for i in disparos:
if i[0] == 1:
pygame.draw.circle(screen, (0, 255, 0), i[1], 16)
elif i[0] == 3:
pygame.draw.circle(screen, (255, 0, 0), i[1], 64)
if not pause:
miaviso = texto.render("Musica en reproduccion", True, (255, 255, 255))
else:
miaviso = texto.render("Musica en pausa", True, (255, 255, 255))
screen.blit(miaviso, (800/3, 600/3))
pygame.display.flip()
aqui les dejo un link para descargar el ejemplo con todo y sonidos!:
http://www.4shared.com/file/235697139/33099857/modulo_mixertar.html
tambien estoy haciendo uso de otros modulos y experimentando con los mismos para realizar algo asi como una referencia como otro usuario cuyo nick no recuerdo hizo en su momento.