Python - Evitar superposición de sonidos en pygame.

 
Vista:
sin imagen de perfil

Evitar superposición de sonidos en pygame.

Publicado por BigfooTsp (12 intervenciones) el 09/01/2017 19:44:32
Hola.
Estoy desarrollando un juego en pygame tipo RPG y le pongo un sonido de pasos al personaje mientras camina con el módulo pygame.mixer.sound.
El problema está en que inicio la reproducción del sonido al mismo tiempo que detecta un evento del teclado para caminar, y se inicia el sonido a cada paso en lugar de estar reproduciéndose solamente mientras camina... esto acaba resultando en una superposición de varias reproducciones simultaneas del mismo archivo de sonido.

A continuación pongo el código del módulo donde incorporo el sonido de pasos, estoy dándole vueltas a ver como hago un bucle que me permita reproducir el sonido solo si no está reproduciéndose ya u otra forma de poder solucionar esto. (líneas 22 y 40)

El código completo (excepto los últimos cambios) lo tengo en https://github.com/BigfooTsp/Pygame.Cris
aunque es bastante más complejo y para la duda que tengo creo que con esto valdrá para que me entendáis

A ver si se os ocurre algo... Gracias!

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
import pygame
from pygame.locals import *
 
import escenario
import personaje
 
 
class Mundo:
    ''' Clase para controlar todo lo que ocurre durante el juego: '''
 
    def __init__(self, mapa, personajes):
        print ("Instanciando Mundo...")
 
        self._mapa = mapa
        self.personajes = personajes # array con los personajes
        self._jugador = personajes[0]
        self._jugadorPosAbs =  mapa._char_posabs
        self._jugadorRect = (self._jugadorPosAbs[0], self._jugadorPosAbs[1],
                            self._jugador.rect.w, self._jugador.rect.h)
 
        #Sonidos
        self.paso = pygame.mixer.Sound('utilidades/sonido/step.ogg')
 
 
    def mover_jugador(self, orientacion):
        ''' movimiento del jugador si es posible.'''
 
        avance = self._jugador.orientacion[orientacion]
        direccion = (self._jugadorPosAbs[0] + self._jugador.orientacion[orientacion][0],
                     self._jugadorPosAbs[1] + self._jugador.orientacion[orientacion][1])
 
        print ('moviendo personaje hacia el %s a posición %s' %(orientacion, direccion))
 
        if self.espisable(avance):
            self._jugadorPosAbs = direccion
            self._jugador.pos = (self._jugador.pos[0] + self._jugador.orientacion[orientacion][0],
                                 self._jugador.pos[1] + self._jugador.orientacion[orientacion][1])
 
        self.actualizar_posicion(orientacion)
        self.paso.play()
 
        return
 
 
    def espisable(self, avance):
        ''' devuelve True si el terreno es pisable '''
        #[.] poner limites del mapa o rectángulo de límite.
 
        # mueve tantas posiciones como se indica en 'direccion'.
        pos = self._jugadorRect.move(avance)
 
        # si hay colisión
        idx = pos.collidelist(self._mapa._nopisable)
        if idx == -1:
            print ('avanzando')
            return True
        else: # Si hay colisión no se mueve
            print ('! colisión escenario', idx, self._mapa._nopisable[idx])
            return False
 
 
    def _hay_colisión(self):
        ''' gestion de colisión con elementos de escenario y otros personajes.'''
 
    	# colisiones escenario
    	# otros personajes
        ''' según la posición de los elementos del escenario comprueba colisiones
        y sus resultados en la escena '''
 
        return False
 
 
    def actualizar_camara(self):
        ''' Cámara y desplazamiento del mapa con el personaje principal.
            actualiza coordenadas absolutas y relativas.'''
 
        coordenadas = [0,0]
        posabsX = self._jugadorPosAbs[0]
        posabsY = self._jugadorPosAbs[1]
        posrelX = self._jugador.pos[0]
        posrelY = self._jugador.pos[1]
        mapasizeX = self._mapa._mapa_size[0]
        mapasizeY = self._mapa._mapa_size[1]
        camarasizeX = self._mapa._camara_size[0]
        camarasizeY = self._mapa._camara_size[1]
 
        # colocar posición inicial de personaje y coordenadas.
        if (posabsX > camarasizeX/2) or (posabsX < mapasizeX-camarasizeX/2) :
            posrelX = camarasizeX/2
            coordenadas[0] = (posabsX - camarasizeX/2)
        if (posabsY > camarasizeY/2) or (posabsY < mapasizeY-camarasizeY/2) :
            posrelY = camarasizeY/2
            coordenadas[1] = (posabsY - camarasizeY/2)
 
        if posabsX < camarasizeX/2:
            posrelX = posabsX
            coordenadas[0] = 0
        if posabsX > mapasizeX-camarasizeX/2:
            posrelX = camarasizeX - (mapasizeX - posabsX)
            coordenadas[0] = mapasizeX - camarasizeX
        if posabsY < camarasizeY/2:
            posrelY = posabsY
            coordenadas[1] = 0
        if posabsY > mapasizeY-camarasizeY/2:
            posrelY = camarasizeY - (mapasizeY - posabsY)
            coordenadas[1] = mapasizeY - camarasizeY
 
        self._mapa._coordenadas = (coordenadas[0], coordenadas[1], camarasizeX, camarasizeY )
        self._jugador.pos = (posrelX, posrelY)
 
        self._jugadorRect = pygame.Rect(
            self._jugadorPosAbs[0], self._jugadorPosAbs[1],
            self._jugador.rect.w, self._jugador.rect.h)
 
 
    def actualizar_posicion(self, orientacion):
        ''' muve personajes y elementos'''
        ''' [.] Tal vez sea redundante con update().
        aunque en este momento solo utilizo al jugador, puede que
        esta función sea útil para controlar a todos los personajes...
        veremos conforme vaya desarrollando el juego.'''
 
        self._jugador.mover('camina_%s'%(orientacion))
        pygame.mixer
 
 
    def update(self):
        ''' mueve y actualiza las posiciones de los personajes '''
 
        # comprueba acciones
        # colisiones
 
        if self._hay_colisión():
            None
        self.actualizar_camara()
 
 
    def dibujar(self, surface):
        self._mapa.dibujar(surface)
 
        for personaje in self.personajes:
            personaje.dibujar(surface)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Evitar superposición de sonidos en pygame.

Publicado por BigfooTsp (12 intervenciones) el 09/01/2017 20:17:24
Bueno.... ya lo he solucionado con pygame.mixer.channel :) modificando lo siguiente:

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
self.paso = pygame.mixer.Sound('utilidades/sonido/step.ogg')
        self.channel1 = pygame.mixer.Channel(1)
        self.channel1.set_volume(4)
 
 
 
    def mover_jugador(self, orientacion):
        ''' movimiento del jugador si es posible.'''
 
        avance = self._jugador.orientacion[orientacion]
        direccion = (self._jugadorPosAbs[0] + self._jugador.orientacion[orientacion][0],
                     self._jugadorPosAbs[1] + self._jugador.orientacion[orientacion][1])
 
        print ('moviendo personaje hacia el %s a posición %s' %(orientacion, direccion))
 
        if self.espisable(avance):
            self._jugadorPosAbs = direccion
            self._jugador.pos = (self._jugador.pos[0] + self._jugador.orientacion[orientacion][0],
                                 self._jugador.pos[1] + self._jugador.orientacion[orientacion][1])
 
        self.actualizar_posicion(orientacion)
        if self.channel1.get_busy() == False:
            self.channel1.play(self.paso)
 
        return

Pero gracias....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Evitar superposición de sonidos en pygame.

Publicado por xve (1646 intervenciones) el 09/01/2017 23:37:01
Gracias por compartirlo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar