Звук будет воспроизводиться в другом потоке и не остановит исполнение. Однако ваш цикл содержит time.sleep(.2)
, что остановит выполнение на 0.2
секунды. И вы делаете это для каждой ноты, что означает, что если у вас есть мелодия с 10 нотами, она остановит вашу программу на 2 секунды.
Существует множество различных решений вашей конкретной проблемы, все зависит от того, как вы структурировали код, в котором вы вызываете эту функцию. Одним из решений может быть планирование событий, а затем их воспроизведение, когда они появляются в очереди событий. Другой - вызывать отдельные звуки, когда они должны быть воспроизведены. И то, и другое требует игрового цикла, который, я сомневаюсь, у вас есть, поскольку вы создаете консольную игру.
Я бы пошел по простому пути и соединил бы звуки с тем общим звуком, который вы действительно хотите играть, вместо того, чтобы воспроизводить много разных звуков подряд. Вы можете использовать некоторые программы, такие как Audacity для редактирования звуковых файлов. Тогда вам даже не понадобится функция. Вы можете просто вызвать pygame.mixer.Sound.play(zelda_pickup_tune)
, и все будет работать без остановки (при условии, что zelda_pickup_tune
- это переменная, которая содержит действительный Sound
объект).
Кроме того, не используйте exec
. Это медленно и потенциально может быть угрозой безопасности, если вы когда-нибудь позволите другим людям использовать ваш код (в настоящее время вы не используете его точно, но это может легко произойти, если позже вы внесете небольшие изменения). Это также немного "волшебно", и невозможно переписать этот код на других языках.
Я бы предложил более стандартный подход к таким проблемам и использовал бы словарь.
def music(notes):
note_list = ["c","c2","d","d2","e","e2","f","f2","g","g2","a","a2"]
sounds = {} # Empty dictionary
for i in note_list:
sounds[i] = pygame.mixer.Sound('res/sounds/{}.wav'.format(i)) # Add note i as key and the sound as value.
for i in notes:
for j in i:
sounds[j].play() # Look up the sound with key i and play the sound.
time.sleep(.2)