Многопоточная музыка, играющая с Pygame в терминале - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать текстовую игру и добавить к ней немного музыки, и, может быть, тоже звучит, однако, «Большим и величайшим» ответом была Pygame. После тестирования я обнаружил, что когда вы используете ЛЮБУЮ функцию Pygame, она останавливает текущую терминальную сессию от вывода дополнительной информации, это останавливает продолжение игры.

Сначала я попробовал обычный ...

from pygame import *
def some_function():
    mixer.load("music.mp3")
    mixer.music.play(0)

    clock = time.Clock()
    clock.tick(10)
    while mixer.music.get_busy():
        clock.tick(10)
    Rest_of_function

И, конечно, это не работает, потому что это цикл, и он делает это по порядку, поэтому я попробовал в следующий раз ...

from file_with_music import * #added threading to this file

def main():
    file_with_music.start()
    Rest_of_Function

Это, однако, не сработало, поскольку раздражающий всплывающий вывод терминала "Welcome to pygame" снова заблокирован ...

ТАК, следующим шагом было создание нового файла и ...

from Main import *
from Intro_Sounds import *

if __name__ == '__main__':
    Intro_Thread.start() #Intro did not start because pygame popup was somehow called
    Music_Thread.start()

Даже после помещения их в потоки все равно не получалось ...

В качестве примечания, в Main есть встроенная функция, предназначенная для выполнения

Music_Thread.join()
Music_Thread.stop()

После того, как определенный вход встречен.

Ожидаемый результат - воспроизведение музыки в фоновом режиме, в то время как терминал продолжает распечатывать ввод и принимать ввод до тех пор, пока не будет введен ввод, который уничтожит музыкальную нить. Конечно, это не сработало, и я в растерянности ...

Как воспроизводить музыку, не замораживая терминал.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Попробовав несколько вещей, которые я нашел ...

Pygame не дружит со звуком и выводом терминала, поэтому не будет работать.

WxPython больше не имеет функционального звукового модуля, что делает его бесполезным.

Другие проекты заброшены или зависят от ОС ...

Однако я обнаружил, что PyOpenAL на самом деле работает, хотя он не может понимать mp3-файлы или 32-битные файлы с плавающей запятой. Вместо того, чтобы использовать многопоточность, я переключился на многопроцессорность (создав сценарий на 2000 строк, чтобы должным образом узнать, как работает модуль), и теперь звук воспроизводится (и зацикливается), позволяя выводить через терминал.

TL: DR

PyOpenAL является победителем.

0 голосов
/ 07 января 2019

К сожалению, pygame.mixer не имеет такой возможности (насколько я знаю). Используйте winsound вместо:

import winsound  # only on windows tho...
winsound.PlaySound('sound.wav', winsound.SND_ASYNC)  # this will play the sound and...
print('I can still print :D')                        # this can still print :D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...