From 2e712a954e66cda27db4cb027db136cc526014d3 Mon Sep 17 00:00:00 2001 From: adastram Date: Sun, 7 Jan 2024 18:22:29 +0100 Subject: [PATCH 1/2] Imported sound_manager --- src/engine/engine.py | 3 ++ src/engine/renderer.py | 4 +- src/engine/sound_manager.py | 95 +++++++++++++++++++++++++++++++++++++ src/main.py | 2 +- 4 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/engine/sound_manager.py diff --git a/src/engine/engine.py b/src/engine/engine.py index 2d1dc8d..392c8d7 100644 --- a/src/engine/engine.py +++ b/src/engine/engine.py @@ -5,6 +5,7 @@ from src.engine.event_handler import EventHandler from src.engine.map_manager import MapManager from src.engine.renderer import Renderer from src.engine.enums import GameState +from src.engine.sound_manager import SoundManager import pygame @@ -31,6 +32,7 @@ class Engine: self.camera = Camera() self.entity_manager = EntityManager(self.map_manager) self.boss_fight_manager = BossFightManager(self) + self.sound_manager = SoundManager(60) def loop(self): """Fonction à lancer au début du programme et qui va lancer les updates dans une boucle. @@ -47,6 +49,7 @@ class Engine: self.entity_manager.update(0.016666666) self.renderer.update(0.016666666) self.event_handler.update() + self.sound_manager.update(1/60) def stop(self): """Arrête le programme.""" diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 39f1393..9820fef 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -112,7 +112,7 @@ class Renderer: self.render_boss_fight_scene(delta) self.render_boss_fight_gui() - # Conteur de FPS en mode DEBUG + # Conteur de données (FPS, Coords, Volume) en mode DEBUG if self.engine.DEBUG_MODE: self.window.blit(font.SysFont("Arial", 20).render(f"FPS: {self.engine.clock.get_fps()}", True, (255, 0, 0)), (0, 0)) @@ -121,6 +121,8 @@ class Renderer: True, (255, 0, 0)), (0, 30)) self.window.blit(font.SysFont("Arial", 20).render(f"Zoom: {self.engine.camera.zoom}", True, (255, 0, 0)), (0, 60)) + self.window.blit(font.SysFont("Arial", 20).render(f"Volume: {self.engine.sound_manager.get_music_volume()}", + True, (255, 0, 0)), (0, 90)) # Apres avoir tout rendu, on met à jour l'écran display.update() diff --git a/src/engine/sound_manager.py b/src/engine/sound_manager.py new file mode 100644 index 0000000..d967189 --- /dev/null +++ b/src/engine/sound_manager.py @@ -0,0 +1,95 @@ +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.play_music_playlist = False + + self.music_before_pause_pos = 0 + self.music_before_pause_song = "" + self.music_is_paused = False + + self.set_music_volume(music_base_volume) + + + self.add_to_music_playlist("C:\\Users\\kerri\\Downloads\\Code\\NSI-RPG\\assets\\OST\\Lost Woods - The Legend of Zelda Ocarina of Time.mp3") + self.add_to_music_playlist("C:\\Users\\kerri\\Downloads\\Code\\NSI-RPG\\assets\\OST\\Hyrule Field - The Legend of Zelda Ocarina of Time.mp3") + self.start_music_playlist() + + + self.do1 = True + self.do2 = True + + + + def update(self, delta: float): + self.__tick += delta + self.tick = int(self.__tick / delta) + self.time = self.tick * delta + + + if self.play_music_playlist and not self.music_is_paused: + if not mixer.music.get_busy(): + current_song_index = self.music_playlist.index(self.music_current_song) + if len(self.music_playlist) == 0: + pass + elif len(self.music_playlist) - 1 <= current_song_index: + self.__play_music(self.music_playlist[0]) # Recommence depuis le début de la playlist + else: + self.__play_music(self.music_playlist[current_song_index + 1]) # Joue la musique suivante dans la playlist + + + if self.time > 5 and self.do1: + self.do1 = False + self.pause_music(5) + + if self.time > 15 and self.do2: + self.do2 = False + self.resume_music(5) + + + def get_music_volume(self): + return mixer.music.get_volume() * 100 + + def set_music_volume(self, new_volume: float): + """Définit le nouveau volume de la musique""" + mixer.music.set_volume((round(new_volume / 100, 3))) + + def pause_music(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 = mixer.music.get_pos() / 1000 + 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 resume_music(self, fade_s: float): + self.__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 __play_music(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 + + def add_to_music_playlist(self, song_path: str): + self.music_playlist.append(song_path) + + def remove_from_music_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 start_music_playlist(self): + self.play_music_playlist = True + + def stop_music_playlist(self): + self.play_music_playlist = False \ No newline at end of file diff --git a/src/main.py b/src/main.py index 5287bd9..9d4bdef 100644 --- a/src/main.py +++ b/src/main.py @@ -17,7 +17,7 @@ class Game(Engine): self.load_boss_fight_assets() self.spawn_mobs() - self.DEBUG_MODE = False + self.DEBUG_MODE = True self.game_state = GameState.NORMAL From 81314a60a970a000fd87c2774fa645826f7c80fb Mon Sep 17 00:00:00 2001 From: adastram Date: Sun, 7 Jan 2024 21:21:26 +0100 Subject: [PATCH 2/2] Musique de fond fonctionnel --- src/engine/renderer.py | 10 +++-- src/engine/sound_manager.py | 77 ++++++++++++++++++------------------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/src/engine/renderer.py b/src/engine/renderer.py index 9820fef..849abb1 100644 --- a/src/engine/renderer.py +++ b/src/engine/renderer.py @@ -114,15 +114,17 @@ class Renderer: # Conteur de données (FPS, Coords, Volume) en mode DEBUG 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)) 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)) - 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)) - self.window.blit(font.SysFont("Arial", 20).render(f"Volume: {self.engine.sound_manager.get_music_volume()}", + 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)) # Apres avoir tout rendu, on met à jour l'écran display.update() diff --git a/src/engine/sound_manager.py b/src/engine/sound_manager.py index d967189..2630cac 100644 --- a/src/engine/sound_manager.py +++ b/src/engine/sound_manager.py @@ -7,89 +7,88 @@ class SoundManager: self.music_playlist = [] self.music_current_song = "" - self.play_music_playlist = False + 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.set_music_volume(music_base_volume) + self.music_pos_delay = 0 + self.music_set_volume(music_base_volume) - self.add_to_music_playlist("C:\\Users\\kerri\\Downloads\\Code\\NSI-RPG\\assets\\OST\\Lost Woods - The Legend of Zelda Ocarina of Time.mp3") - self.add_to_music_playlist("C:\\Users\\kerri\\Downloads\\Code\\NSI-RPG\\assets\\OST\\Hyrule Field - The Legend of Zelda Ocarina of Time.mp3") - self.start_music_playlist() - - - self.do1 = True - self.do2 = True - - def update(self, delta: float): self.__tick += delta self.tick = int(self.__tick / delta) self.time = self.tick * delta - - if self.play_music_playlist and not self.music_is_paused: + if self.music_play_playlist and not self.music_is_paused: # Musique de fond if not mixer.music.get_busy(): - current_song_index = self.music_playlist.index(self.music_current_song) + if len(self.music_playlist) == 0: pass - elif len(self.music_playlist) - 1 <= current_song_index: - self.__play_music(self.music_playlist[0]) # Recommence depuis le début de la playlist + elif self.music_current_song == "": + self.__music_play(self.music_playlist[0]) else: - self.__play_music(self.music_playlist[current_song_index + 1]) # Joue la musique suivante dans la playlist - - - if self.time > 5 and self.do1: - self.do1 = False - self.pause_music(5) - - if self.time > 15 and self.do2: - self.do2 = False - self.resume_music(5) + 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 get_music_volume(self): + def music_get_volume(self): return mixer.music.get_volume() * 100 - def set_music_volume(self, new_volume: float): + 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 pause_music(self, fade_s: float, restart_tolerance: float = 33): + 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 = mixer.music.get_pos() / 1000 + fade_s * restart_tolerance / 100 # Récupère la position a laquelle le son doit reprendre lors du .resume() + 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 resume_music(self, fade_s: float): - self.__play(self.music_before_pause_song, fade_s, self.music_before_pause_pos) + 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 __play_music(self, song: str, fade_s: float = 0, start_at: float = 0): + + 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 add_to_music_playlist(self, song_path: str): + def music_add_to_playlist(self, song_path: str): self.music_playlist.append(song_path) - def remove_from_music_playlist(self, song_path: str = None, index: int = None): + 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 start_music_playlist(self): - self.play_music_playlist = True + def music_start_playlist(self): + self.music_play_playlist = True - def stop_music_playlist(self): - self.play_music_playlist = False \ No newline at end of file + def music_stop_playlist(self): + self.music_play_playlist = False