2016-09-16 57 views
0

我遇到music.fadeout()問題。據我瞭解,音樂將在淡出後停止。那爲什麼呢,下面的代碼是否允許在淡出期間播放聲音,但不能播放之後?在淡出之後,這些聲音混合在一起; mixer.get_busy()返回True。music.fadeout()似乎會在完成淡出後屏蔽聲音

如果我用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 

編輯

我的具體問題特德,我不認爲在你的答案覆蓋(可能我只是密集)如下所示:

當我開始音樂(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") 
+0

Fadeout會在淡出時間之後停止音樂,如'pygame.mixer.music.stop()'。我很抱歉,但我無法複製您的問題。當我淡出音樂時,我仍然可以播放並在音樂淡出時停止播放聲音。 –

+0

啊,drat。無論如何,非常感謝你的答覆。 –

+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") 

然而,如果「聲音」你說的是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()