ajout de plus de son et d'une meilleure gestion des players

This commit is contained in:
Faraphel 2023-03-08 18:18:17 +01:00
parent 94243d3028
commit 1c872f7a28
4 changed files with 42 additions and 12 deletions

15
NOTE.md
View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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