在淡出完成后,music.fadeout()似乎会阻止声音

时间:2016-09-16 07:19:02

标签: pygame

我遇到了music.fadeout()的问题。据我所知,音乐将在淡出后停止。那么为什么以下代码是否允许在淡出期间播放声音而不是之后?淡出后,声音混杂在一起; mixer.get_busy()返回True。

如果我使用music.stop()代替.fadeout()音乐播放后播放的声音。

我在这里缺少什么?

if not game_over:
        if music_on:
            pygame.mixer.music.fadeout(3000)
            #pygame.mixer.music.stop()
        music_on = False

与此同时,我已经做到了这一点来解决它:

if not game_over:
        if music_on:
            pygame.mixer.music.fadeout(3000)
            fadeout_start = ticks
            #pygame.mixer.music.stop()
        if fadeout_start + 3000 < ticks:
            pygame.mixer.music.stop()
        music_on = False

修改

我的具体问题Ted,我不认为在你的回答(也许我只是在密集)中涵盖了以下内容:

当我开始音乐(K_1),然后停止它(K_2)然后播放声音对象(K_5),mixer.get_busy为True并且声音可以听到。但是,如果我重复上述但是逐渐淡出音乐(K_3)而不是停止使用K_2,则mixer.get_busy为True,但没有声音。

Pydocs似乎暗示音乐在淡出后以与简单music.stop()相同的方式停止。

import pygame
from pygame.locals import *
import sys

pygame.init()
pygame.mixer.init()
pygame.display.set_mode((200,200))
pygame.display.set_caption("Sound tester")

clock = pygame.time.Clock()

pygame.mixer.music.load("theme.mid")
sound = pygame.mixer.Sound("missile.wav")

playing = pygame.mixer.get_busy()



while True:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYUP:
            if event.key == pygame.K_1:
                pygame.mixer.music.play(-1)
            elif event.key == K_2:
                pygame.mixer.music.stop()
            elif event.key == K_3:
                pygame.mixer.music.fadeout(2000)
            elif event.key == K_4:
                pygame.mixer.music.stop()
            elif event.key == K_5:
                sound.play(-1)
            elif event.key == K_6:
                pygame.mixer.stop()

    music_playing = pygame.mixer.music.get_busy()
    if music_playing:
        print("music playing")
    else:
        print("no music")

    sound_playing = pygame.mixer.get_busy()
    if sound_playing:
        print("Sound playing")
    else:
        print("no sound")

1 个答案:

答案 0 :(得分:1)

函数pygame.mixer.music.fadeout(3000)将使音量淡化3秒,然后它将停止音乐。音乐停止后你需要再次启动它。您的代码在淡出后不应播放任何音乐,并且必须是因为您的程序中存在其他逻辑错误(也许您正在连续设置music_on = True)。

这里有一些代码展示了它是如何工作的:

import pygame
pygame.init()
pygame.display.set_mode((250, 200))
clock = pygame.time.Clock()

pygame.mixer.music.load("music.wav")
playing = pygame.mixer.music.get_busy()

while 1:
    clock.tick(30)

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_f:
                pygame.mixer.music.fadeout(3000)
                print("Fading out")
            elif event.key == pygame.K_p:
                pygame.mixer.music.play(-1)
                print("Play")
            elif event.key == pygame.K_s:
                pygame.mixer.music.stop()
                print("Stop")
        elif event.type == pygame.QUIT:
            quit()

    if playing != pygame.mixer.music.get_busy():
        playing = pygame.mixer.music.get_busy()
        if playing:
            print("Music is playing")
        else:
            print("Music is not playing")

但是,如果通过“sound”表示pygame.mixer.Sound个对象,那么它就非常有意义了。 pygame.mixer.music模块在​​pygame.mixer处理声音时处理音乐的播放。这些是分开的(虽然紧密相连)。在停止pygame.mixer停止音乐时停止pygame.mixer.music停止声音。

尝试使用以下代码。按1将启动音乐和声音并立即停止pygame.mixer,按2将启动音乐和声音并立即停止pygame.mixer.music。你应该在这里停止不同的事情。

import pygame
pygame.init()
pygame.display.set_mode((250, 200))
clock = pygame.time.Clock()

pygame.mixer.music.load("music.wav")
sound = pygame.mixer.Sound("sound.wav")

playing = pygame.mixer.music.get_busy()

while 1:
    clock.tick(30)

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                sound.play(-1)
                pygame.mixer.music.play(-1)
                pygame.mixer.stop()
            elif event.key == pygame.K_2:
                sound.play(-1)
                pygame.mixer.music.play(-1)
                pygame.mixer.music.stop()
        elif event.type == pygame.QUIT:
            quit()