Merge pull request 'SoundManager' (#24) from SoundManager into main
Reviewed-on: #24
This commit is contained in:
commit
d74a7038a0
|
@ -8,6 +8,7 @@ from src.engine.map_manager import MapManager
|
||||||
from src.engine.menu_manager import MenuManager
|
from src.engine.menu_manager import MenuManager
|
||||||
from src.engine.renderer import Renderer
|
from src.engine.renderer import Renderer
|
||||||
from src.engine.enums import GameState
|
from src.engine.enums import GameState
|
||||||
|
from src.engine.sound_manager import SoundManager
|
||||||
import pygame
|
import pygame
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ class Engine:
|
||||||
self.event_sheduler = EventSheduler(self)
|
self.event_sheduler = EventSheduler(self)
|
||||||
self.dialogs_manager = DialogsManager(self.event_handler)
|
self.dialogs_manager = DialogsManager(self.event_handler)
|
||||||
self.menu_manager = MenuManager(self)
|
self.menu_manager = MenuManager(self)
|
||||||
|
self.sound_manager = SoundManager(60)
|
||||||
|
|
||||||
def loop(self):
|
def loop(self):
|
||||||
"""Fonction à lancer au début du programme et qui va lancer les updates dans une boucle.
|
"""Fonction à lancer au début du programme et qui va lancer les updates dans une boucle.
|
||||||
|
@ -55,6 +57,7 @@ class Engine:
|
||||||
self.event_handler.update()
|
self.event_handler.update()
|
||||||
self.event_sheduler.update()
|
self.event_sheduler.update()
|
||||||
self.dialogs_manager.update(0.016666666)
|
self.dialogs_manager.update(0.016666666)
|
||||||
|
self.sound_manager.update(1/60)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
"""Arrête le programme."""
|
"""Arrête le programme."""
|
||||||
|
|
|
@ -117,13 +117,17 @@ class Renderer:
|
||||||
|
|
||||||
# Conteur de FPS en mode DEBUG
|
# Conteur de FPS en mode DEBUG
|
||||||
if self.engine.DEBUG_MODE:
|
if self.engine.DEBUG_MODE:
|
||||||
self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {self.engine.clock.get_fps()}", True, (255, 0, 0)),
|
self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {round(self.engine.clock.get_fps())}", True, (255, 0, 0)),
|
||||||
(0, 0))
|
(0, 0))
|
||||||
player = self.engine.entity_manager.get_by_name('player')
|
player = self.engine.entity_manager.get_by_name('player')
|
||||||
self.window.blit(font.SysFont("Arial", 20).render(f"X: {player.x} Y:{player.y}",
|
self.window.blit(font.SysFont("Arial", 20).render(f"X: {round(player.x, 2)} Y:{round(player.y, 2)}",
|
||||||
True, (255, 0, 0)), (0, 30))
|
True, (255, 0, 0)), (0, 30))
|
||||||
self.window.blit(font.SysFont("Arial", 20).render(f"Zoom: {self.engine.camera.zoom}",
|
self.window.blit(font.SysFont("Arial", 20).render(f"Zoom: {round(self.engine.camera.zoom, 2)}",
|
||||||
True, (255, 0, 0)), (0, 60))
|
True, (255, 0, 0)), (0, 60))
|
||||||
|
self.window.blit(font.SysFont("Arial", 20).render(f"Volume: {self.engine.sound_manager.music_get_volume()}, Pos: {self.engine.sound_manager.music_get_current_song_pos()}s, Index: {self.engine.sound_manager.music_current_index}, Paused: {self.engine.sound_manager.music_is_paused}",
|
||||||
|
True, (255, 0, 0)), (0, 90))
|
||||||
|
self.window.blit(font.SysFont("Arial", 20).render(f"Track: {self.engine.sound_manager.music_current_song}",
|
||||||
|
True, (255, 0, 0)), (0, 120))
|
||||||
|
|
||||||
# On rend maintenant toutes les zones de détection de la fenêtre
|
# On rend maintenant toutes les zones de détection de la fenêtre
|
||||||
for area in self.engine.event_handler.buttons_area:
|
for area in self.engine.event_handler.buttons_area:
|
||||||
|
|
94
src/engine/sound_manager.py
Normal file
94
src/engine/sound_manager.py
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
from pygame import mixer
|
||||||
|
|
||||||
|
class SoundManager:
|
||||||
|
def __init__(self, music_base_volume: float):
|
||||||
|
self.__tick = 0 # Compteur de la valeur d'un tick sur 1 (Utilisé pour le comptage de tick)
|
||||||
|
self.time = 0 # Temps local a la class (en s)
|
||||||
|
|
||||||
|
self.music_playlist = []
|
||||||
|
self.music_current_song = ""
|
||||||
|
self.music_play_playlist = False
|
||||||
|
self.music_current_index = 0
|
||||||
|
|
||||||
|
self.music_before_pause_pos = 0
|
||||||
|
self.music_before_pause_song = ""
|
||||||
|
self.music_is_paused = False
|
||||||
|
|
||||||
|
self.music_pos_delay = 0
|
||||||
|
|
||||||
|
self.music_set_volume(music_base_volume)
|
||||||
|
|
||||||
|
|
||||||
|
def update(self, delta: float):
|
||||||
|
self.__tick += delta
|
||||||
|
self.tick = int(self.__tick / delta)
|
||||||
|
self.time = self.tick * delta
|
||||||
|
|
||||||
|
if self.music_play_playlist and not self.music_is_paused: # Musique de fond
|
||||||
|
if not mixer.music.get_busy():
|
||||||
|
|
||||||
|
if len(self.music_playlist) == 0:
|
||||||
|
pass
|
||||||
|
elif self.music_current_song == "":
|
||||||
|
self.__music_play(self.music_playlist[0])
|
||||||
|
else:
|
||||||
|
just_played_index = self.music_playlist.index(self.music_current_song)
|
||||||
|
if len(self.music_playlist) - 1 <= just_played_index: # Dernier son de la playlist / la playlist a rétréci entre temps
|
||||||
|
self.music_current_index = 0
|
||||||
|
self.__music_play(self.music_playlist[0]) # Recommence depuis le début de la playlist
|
||||||
|
else:
|
||||||
|
self.music_current_index = just_played_index + 1
|
||||||
|
self.__music_play(self.music_playlist[self.music_current_index]) # Joue la musique suivante dans la playlist
|
||||||
|
|
||||||
|
|
||||||
|
def music_get_volume(self):
|
||||||
|
return mixer.music.get_volume() * 100
|
||||||
|
|
||||||
|
def music_set_volume(self, new_volume: float):
|
||||||
|
"""Définit le nouveau volume de la musique"""
|
||||||
|
mixer.music.set_volume((round(new_volume / 100, 3)))
|
||||||
|
|
||||||
|
def music_pause(self, fade_s: float, restart_tolerance: float = 33):
|
||||||
|
"""Met en pause la musique, la musique reprendra à la fin de la musique moin la tolérance (en pourcentage)"""
|
||||||
|
self.music_is_paused = True
|
||||||
|
self.music_before_pause_pos = self.music_get_current_song_pos() + fade_s * restart_tolerance / 100 # Récupère la position a laquelle le son doit reprendre lors du .resume()
|
||||||
|
self.music_before_pause_song = self.music_current_song
|
||||||
|
|
||||||
|
mixer.music.fadeout(fade_s * 1000)
|
||||||
|
|
||||||
|
def music_resume(self, fade_s: float):
|
||||||
|
self.__music_play(self.music_before_pause_song, fade_s, self.music_before_pause_pos)
|
||||||
|
self.music_before_pause_pos = 0
|
||||||
|
self.music_before_pause_song = ""
|
||||||
|
|
||||||
|
|
||||||
|
def music_get_current_song_pos(self):
|
||||||
|
if mixer.music.get_busy():
|
||||||
|
return round(mixer.music.get_pos() /1000 + self.music_pos_delay, 3)
|
||||||
|
else:
|
||||||
|
return round(self.music_before_pause_pos, 3)
|
||||||
|
|
||||||
|
|
||||||
|
def __music_play(self, song: str, fade_s: float = 0, start_at: float = 0):
|
||||||
|
mixer.music.unload()
|
||||||
|
mixer.music.load(song)
|
||||||
|
mixer.music.play(0, start_at, fade_s * 1000)
|
||||||
|
|
||||||
|
self.music_is_paused = False
|
||||||
|
self.music_current_song = song
|
||||||
|
self.music_pos_delay = start_at
|
||||||
|
|
||||||
|
def music_add_to_playlist(self, song_path: str):
|
||||||
|
self.music_playlist.append(song_path)
|
||||||
|
|
||||||
|
def music_remove_from_playlist(self, song_path: str = None, index: int = None):
|
||||||
|
if song_path:
|
||||||
|
index = self.music_playlist.index(song_path)
|
||||||
|
if index:
|
||||||
|
self.music_playlist.pop(index)
|
||||||
|
|
||||||
|
def music_start_playlist(self):
|
||||||
|
self.music_play_playlist = True
|
||||||
|
|
||||||
|
def music_stop_playlist(self):
|
||||||
|
self.music_play_playlist = False
|
Loading…
Reference in a new issue