Pygame: музыка не воспроизводится мгновенно в цикле - PullRequest
0 голосов
/ 15 мая 2018

Во-первых, извините за мой плохой английский.

Я пишу игру с Python 3.4 и Pygame. Игра включает в себя сцены, которые обеспечивают вид экрана, музыку и т. Д., Проанализированные из XML скриптов.

Я ожидаю, что музыка воспроизводится мгновенно, но не воспроизводится на следующей сцене.

и не может найти подобную проблему в сети.

как я могу переписать код для мгновенного воспроизведения музыкальной сцены?

Я написал такой код: (графическая часть удалена)

XML-файл находится здесь: https://pastebin.com/bSBiv1jX

import pygame
import xml.etree.ElementTree as ET

class Script():
    def __init__(self, name, filename):
        self.name = name
        self.parsed = ET.parse(filename)
        self.root = self.parsed.getroot()
        self.scene_list = self.root.findall("scene")

        self.flag_list = str(self.root.findtext("flags")).split(",")
        for flag in self.flag_list:
            setattr(self, flag, False)

    def music_play(self, number):
        scene = self.scene_list[number]
        if scene.findtext("music") == 'stop':
            pygame.mixer.music.stop()
        elif scene.findtext("music") != '':
            pygame.mixer.music.load(scene.findtext("music"))
            pygame.mixer.music.play(-1, 0.0)

    def goto(self, number):
        string = self.scene_list[number].findtext("goto")
        if string == '':
            return number
        elif isNumber(string) == True:
            return int(string)
        elif isNumber(string) == False:
            return string

    def if_goto(self, string, number):
        iflist = string.split(', ')
        if getattr(self, iflist[0]) == True
            return int(iflist[1])
        else:
            return number + 1

def isNumber(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def runGame():
    pygame.init()
    windowSurface = pygame.display.set_mode((200, 200))

    clock = pygame.time.Clock()
    run = True

    scene_number = 0

    script = Script('dummy', 'scenario/dummy.xml')

    while run:
        # 입력 처리
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                if scene_number == script.goto(scene_number):
                        scene_number += 1
                    elif scene_number != script.goto(scene_number):
                        if isNumber(script.goto(scene_number)):
                            scene_number = script.goto(scene_number)
                        else:
                            scene_number = script.if_goto(script.goto(scene_number), scene_number)

        script.music_play(scene_number)

        pygame.display.update()

        clock.tick(30)
    pygame.quit()

def main():
    runGame()

if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 15 мая 2018

https://www.pygame.org/docs/ref/music.html#pygame.mixer.music.load

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

https://www.pygame.org/docs/ref/music.html#pygame.mixer.music.play

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

На каждой итерации игрового цикла вы звоните music_play и перезапускаете музыку. Вы должны запускать музыку, только если она еще не запущена.

Вы можете, например, вызывать это только при изменении сцены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...