ajout de plus de son et d'une meilleure gestion des players
This commit is contained in:
parent
94243d3028
commit
1c872f7a28
4 changed files with 42 additions and 12 deletions
15
NOTE.md
15
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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue