
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!
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


0