【问题标题】:Pygame: music do not play instantly on loopPygame:音乐不会立即循环播放
【发布时间】:2018-05-15 07:32:44
【问题描述】:

首先,对不起我的英语不好。

我正在用Python 3.4Pygame 编写游戏。游戏包括提供屏幕视图和音乐等的场景,解析自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()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    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 并重新开始播放音乐。仅当音乐尚未播放时才应开始播放。

    例如,您可以只在场景发生变化时调用它。

    【讨论】:

    • 我明白了。音乐在场景 0 重复播放非常快,在场景 1 停止播放音乐。对吗?
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多