2017-05-07 3 views
1

Voici un court extrait de mon code:Pygame Playlist sans while vrai

import pygame 

class Player(): 

    playlist= ["track1.mp3","track2.mp3",...] 

    def __init__(self): 
    pygame.init()  
    pygame.mixer.music.load(self.playlist[0]) 
    pygame.mixer.music.play() 

    def playnext(self): 
    self.playlist = self.playlist[1:] + [self.playlist[0]] 
    pygame.mixer.music.load(self.playlist[0]) 
    pygame.mixer.music.play() 

Mon problème est que je veux jouer la piste suivante après la première terminée, mais sans en vraie boucle. Cette classe n'est pas la seule dans mon code et je veux que les autres travaillent pendant que la musique joue.

Tout comme un déclencheur; Lorsque la chanson se termine, la fonction playnext() est appelée.

Merci d'avance!

+0

Pourquoi avez-vous besoin? –

+1

@JoshuaNixon N'est-il pas évident qu'il/elle en a besoin pour jouer de la musique de façon séquentielle? –

+1

Aussi, juste pour ne pas confondre d'autres personnes avec cette communauté, vous pouvez supprimer la ligne _ "Voici un MCVE de mon code." _ Il semble souvent y avoir beaucoup de confusion sur ce qu'est un MCVE ([mcve]) , mais cela implique que le code peut être exécuté tel quel afin que d'autres personnes puissent tester et vérifier le comportement/l'erreur que vous avez décrits, et que ce soit minimal. Votre code est actuellement juste un exemple minimal (un ME, si vous voulez), que je ne crois pas est faux dans cette question en soi, mais ne doit pas être confondu avec un réel [mcve]. –

Répondre

1

Vous pouvez utiliser pygame.mixer.music.set_endevent pour faire un événement apparaissent dans la file d'attente d'événements lorsque la fin de la musique. Vérifiez simplement l'événement et passez à la chanson suivante. L'événement sera simplement un entier (comme tous les autres événements). Pour ne pas masquer un autre événement, utilisez pygame.USEREVENT. Si vous avez d'autres événements définis par l'utilisateur, utilisez simplement pygame.USEREVENT + 1, puis pygame.USEREVENT + 2 et ainsi de suite. Assurez-vous simplement que c'est unique.

Aussi, essayez de ne pas mettre de la musique dans votre classe de joueur; refactoriser à une autre classe. Une classe devrait de préférence faire une seule chose. J'ai créé une courte démonstration ci-dessous. Tout sous la ligne if __name__ == '__main__': pourrait être la substance dans votre autre fichier.

import pygame 
pygame.init() 


class MusicPlayer: 

    MUSIC_ENDED = pygame.USEREVENT + 1 

    def __init__(self): 
     pygame.mixer.init() 

     self.songs = ["track1.mp3", "track2.mp3"] 
     self.current_song_index = 0 
     pygame.mixer.music.set_endevent(MusicPlayer.MUSIC_ENDED) 

    def play_next(self): 
     pygame.mixer.music.load(self.songs[self.current_song_index]) 
     pygame.mixer.music.play() 
     self.current_song_index = (self.current_song_index + 1) % len(self.songs) 


if __name__ == '__main__': 
    screen = pygame.display.set_mode((720, 480)) 
    clock = pygame.time.Clock() 

    music_player = MusicPlayer() 

    running = True 
    while running: 

     clock.tick(60) 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       running = False 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_SPACE: 
        music_player.play_next() 
      elif event.type == music_player.MUSIC_ENDED: 
       music_player.play_next() 

     pygame.display.update()