This question already has an answer here:
I'm trying to get background music for my game, but I can't seem to figure it out perfectly. I've used pygame in the past, but it was only for one song during the credits of my game. I want the playlist to play continuously picking each track randomly. I've managed to get this working in a separate test file. I will post this code down below.
The problem is when I call this function in my main game, the music plays the first track, and then stops. If I put in
while pygame.mixer.music.get_busy():
continue
It just plays the music and doesn't let me play the game. I want it to loop continuously through the playlist while the user plays the game (it's a text based game so it uses raw_input()
a lot.
Here is my code:
import pygame
import random
pygame.mixer.init()
_songs = [songs, are, here]
_currently_playing_song = None
def music():
global _currently_playing_song, _songs
next_song = random.choice(_songs)
while next_song == _currently_playing_song:
next_song = random.choice(_songs)
_currently_playing_song = next_song
pygame.mixer.music.load(next_song)
pygame.mixer.music.play()
while True: ## This part works for the test, but will not meet my needs
music() ## for the full game.
while pygame.mixer.music.get_busy():
continue
(P.S. I learned python through Zed Shaw's "Learn Python The Hard Way" so my game structure uses the Engine and Map system from the book)
You can use a thread to play music in the background.
If you ever want to stop the music without closing your game, you should kill the thread.
You can set a pygame.mixer.music.set_endevent() which get posted in the event queue when the music finishes. Then you just choose another song. Something along these lines:
So the actual solution is just 3 parts
MUSIC_ENDED = pygame.USEREVENT
.pygame.mixer.music.set_endevent(MUSIC_ENDED)
for event in pygame.event.get(): if event.type == MUSIC_ENDED:
And then you're free to do whatever you desire.