es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer más de 2 canales de sonido para Pygame

Estoy tratando de crear tres canales de sonido para mi juego.

music = pygame.mixer.Channel(0) 
ambience = pygame.mixer.Channel(1)
sfx = pygame.mixer.Channel(2)

Los dos primeros canales funcionan perfectamente. Sin embargo, al llamar al tercero, obtengo el mensaje de error:

AttributeError: el objeto ‘dict’ no tiene atributo ‘play’

No sé por qué mi tercer canal es un diccionario en lugar de un objeto de canal. Cambiar la cantidad de canales o el orden no ayuda.

Este es mi módulo de sonido.

import pygame
import os

pygame.mixer.init()
music = pygame.mixer.Channel(0) 
ambience = pygame.mixer.Channel(1)
sfx = pygame.mixer.Channel(2)

def get_sound(folder, sound):
    return pygame.mixer.Sound(os.path.join(os.path.dirname(__file__)+'\sounds',folder, sound))

sounds = {
    'ambient sailing': get_sound('ambient', 'ambience sailing06.mp3'),
    'ambience forest': get_sound('ambient', 'ambience forest.mp3'),
    'ambience dwarf stronghold': get_sound('ambient', 'ambience dwarf stronghold.mp3'),
    'ambience gnome village': get_sound('ambient', 'ambience gnome village.mp3'),
    'happy vikings' : get_sound('music', 'happy vikings.wav'),
    'drifting' : get_sound('music', 'drifting.mp3'),
}

sfx = {
    'ship move' : get_sound('effects', 'ship move01.wav'),
    'select destination' : get_sound('effects', 'select destination01.wav'),
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que estás sobrescribiendo la variable sfx con un diccionario en tu módulo de sonido. Esto hace que el objeto pygame.mixer.Channel(2) sea sobrescrito con un diccionario, lo que genera el mensaje de error que estás viendo.

    Para solucionarlo, debes cambiar el nombre de una de las variables sfx. Por ejemplo, podrías renombrar el diccionario como sfx_dict o algo similar. Luego, en el código de tu juego, accederías al diccionario usando el nuevo nombre de variable:

    import sound_module
    
    music = pygame.mixer.Channel(0)
    ambience = pygame.mixer.Channel(1)
    sfx_dict = sound_module.sfx
    
    # Reproducir un efecto de sonido desde el diccionario
    sfx_dict['ship_move'].play()
    

    Con este cambio, tu código debería funcionar como se espera y deberías poder usar los tres canales de sonido en tu juego.

Comments are closed.