Как проигрывать звуки по очереди из папки
Я хотел сделать, чтобы можно было закинуть в папку музыку и (играя в игру) слушать то что хочется. у меня несколько проблем:
import os # импортирую.
import pygame # питон и пайгейм.
pygame.init()
relative_path = 'domusic/orient.txt' # ориентир. domusic это папка с музыкой
absolute_path = os.path.abspath(relative_path) # а orient.txt это чтобы компьютер мог найти.
absolute_path = absolute_path[:-12] # /orient.txt срезается, чтобы комп искал музыку в папке.
print(absolute_path)
files = os.listdir(absolute_path) # получаем все файлы папки
print(files)
soundf = []
files.remove('orient.txt') # вырезаем оттуда orient.txt
print(files)
for i in range(0, len(files)): # добавляем музыку в список! (soundf)
soundf.append(pygame.mixer.Sound('domusic/' + files[i]))
for j in range(0, len(soundf)):
(soundf[j]).play() # проигрываем все звуки.
# я пока не догадался, как запускать следующий звук только после окончания предыдущёго.
Ответы (1 шт):
Для реализации фоновой музыки в Pygame лучше использовать pygame.mixer.music
Прежде всего регистрируем ивент окончания музыки чтобы его можно было потом отловить, каждый ивент в Pygame имеет своё уникальный идентификатор (например ивент нажатия кнопки на клавиатуре имеет идентификатор 768), нам же нужен любой незанятый
Чтобы получить незанятый идентификатор можно использовать константу USEREVENT
или любое значение больше неё, ведь все ивенты в Pygame имеют идентификатор меньше чем эта константа
MUSIC_END_EVENT = pygame.USEREVENT
pygame.mixer.music.set_endevent(MUSIC_END_EVENT)
Подготавливаем список с относительными путями к файлам музыки (использовать абсолютный путь если что необязательно), дополнительно фильтруя файлы на всякий случай
music_path = "music"
musics = []
for file_name in os.listdir(music_path):
if file_name.endswith(".mp3"):
musics.append(os.path.join(music_path, file_name))
Сразу же pагружаем и включаем первую музыку из списка, а так же инициализируем переменную в которой будем хранить индекс текущей музыки (это необходимо для того чтобы сменять всю музыку последовательно)
pygame.mixer.music.load(musics[0])
pygame.mixer.music.play()
current_music_index = 0
Ну и наконец в обработчике ивентов ловим наш ивент окончания музыки и включаем следующую
if event.type == MUSIC_END_EVENT:
current_music_index += 1
if current_music_index >= len(musics):
current_music_index = 0
pygame.mixer.music.load(musics[current_music_index])
pygame.mixer.music.play()
Итого получился вот такой шаблон с фоновой музыкой в Pygame
import os
import pygame
pygame.init()
MUSIC_END_EVENT = pygame.USEREVENT
pygame.mixer.music.set_endevent(MUSIC_END_EVENT)
music_path = "domusic"
musics = []
for file_name in os.listdir(music_path):
if file_name.endswith(".mp3"):
musics.append(os.path.join(music_path, file_name))
pygame.mixer.music.load(musics[0])
pygame.mixer.music.play()
current_music_index = 0
running = True
while running:
for event in pygame.event.get():
if event.type == MUSIC_END_EVENT:
current_music_index += 1
if current_music_index >= len(musics):
current_music_index = 0
pygame.mixer.music.load(musics[current_music_index])
pygame.mixer.music.play()