diff --git a/NOTE.md b/NOTE.md index 050334f..a211846 100644 --- a/NOTE.md +++ b/NOTE.md @@ -7,19 +7,16 @@ A faire : 2. Visuel : - animations, mettre la musique, ... - - le replay devrait commencer par la fin ? (évite un bug visuel et les fonctions clears) - Voir les TODOs -3. Autre : - - test avec "assert" (cahier des charges) - - mode d'emploi (video + pdf) expliquant le fonctionnement - -Bug : +3. Bug : - Quitter pendant que l'on décide de si l'on doit charger ou non une ancienne sauvegarde fait crash l'adversaire - - Si le port est déjà utilisé, le jeu n'indique par l'erreur à l'hote + - Si le port est déjà utilisé, le jeu n'indique par l'erreur à l'hôte - Les champs invalides n'empêchent pas de faire l'action - (incertain) Dans de rare cas (souvent en fermant brutalement la fenêtre) le processus ne s'arrête pas - Si la fenêtre est fermé, l'erreur "delete_vao AttributeError: 'NoneType' object has no attribute 'current_context'" apparait parfois - - Autre : - - Tester sur Linux +4. Vérification : + - Tester sur Linux + - test avec "assert" (cahier des charges) + - mode d'emploi (video + pdf) expliquant le fonctionnement diff --git a/source/gui/scene/Game.py b/source/gui/scene/Game.py index 5d87bde..09497f3 100644 --- a/source/gui/scene/Game.py +++ b/source/gui/scene/Game.py @@ -10,7 +10,7 @@ from source.core.enums import BombState from source.core.error import InvalidBombPosition, PositionAlreadyShot from source.gui.scene import GameResult from source.gui.scene.abc import BaseGame -from source.gui import widget, texture, scene +from source.gui import widget, texture, scene, sound from source.network.packet import * from source.type import Point2D from source.utils import StoppableThread @@ -292,6 +292,13 @@ class Game(BaseGame): # sauvegarde la bombe dans l'historique self.history.append((False, packet.position)) + # joue la musique associée à ce mouvement + match bomb_state: + case BombState.NOTHING: sound.Game.touched.play() + case BombState.TOUCHED: sound.Game.missed.play() + case BombState.SUNKEN: sound.Game.sunken_ally.play() + case BombState.WON: sound.Game.loose.play() + # envoie le résultat à l'autre joueur PacketBombState(position=packet.position, bomb_state=bomb_state).send_connection(self.connection) @@ -318,6 +325,13 @@ class Game(BaseGame): # sauvegarde la bombe dans l'historique self.history.append((True, packet.position)) + # joue la musique associée à ce mouvement + match packet.bomb_state: + case BombState.NOTHING: sound.Game.missed.play() + case BombState.TOUCHED: sound.Game.touched.play() + case BombState.SUNKEN: sound.Game.sunken_enemy.play() + case BombState.WON: sound.Game.won.play() + if packet.bomb_state is BombState.WON: # si cette bombe a touché le dernier bateau, alors l'on a gagné self.game_end(won=True) diff --git a/source/gui/scene/GameResult.py b/source/gui/scene/GameResult.py index 2e94953..63557d1 100644 --- a/source/gui/scene/GameResult.py +++ b/source/gui/scene/GameResult.py @@ -24,8 +24,6 @@ class GameResult(Popup): image=texture.Result.Style1.get("victory" if won else "defeat") ) - sound.Game.get("won" if won else "loose").play() - # TODO: rendre l'image transparente si possible from source.gui.scene import MainMenu diff --git a/source/gui/sound/type/abc/SoundType.py b/source/gui/sound/type/abc/SoundType.py index 37bb199..37b4361 100644 --- a/source/gui/sound/type/abc/SoundType.py +++ b/source/gui/sound/type/abc/SoundType.py @@ -6,15 +6,36 @@ import pyglet class SoundType(ABC): loaded_sound: dict[Path, pyglet.media.Source] = {} + player: pyglet.media.Player + + def __init_subclass__(cls, **kwargs): + cls.player = pyglet.media.Player() @classmethod def get_sound(cls, path: Path) -> pyglet.media.Source: if (sound := cls.loaded_sound.get(path)) is None: + # charge le son sound = pyglet.media.load(path) cls.loaded_sound[path] = sound + # modifie la fonction pour jouer le son en utilisant le player + def _play(): + cls.player.delete() # arrête la musique en cours s'il y en a une et vide la queue + cls.player.queue(sound) # ajoute la musique à la queue + cls.player.play() # joue la musique + + sound.play = _play + return sound @abstractmethod def __get__(self, instance, owner) -> pyglet.image.AbstractImage: pass + + @property + def volume(self): + return self.player.volume + + @volume.setter + def volume(self, volume: float): + self.player.volume = volume