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 :
|
2. Visuel :
|
||||||
- animations, mettre la musique, ...
|
- animations, mettre la musique, ...
|
||||||
- le replay devrait commencer par la fin ? (évite un bug visuel et les fonctions clears)
|
|
||||||
- Voir les TODOs
|
- Voir les TODOs
|
||||||
|
|
||||||
3. Autre :
|
3. Bug :
|
||||||
- test avec "assert" (cahier des charges)
|
|
||||||
- mode d'emploi (video + pdf) expliquant le fonctionnement
|
|
||||||
|
|
||||||
Bug :
|
|
||||||
- Quitter pendant que l'on décide de si l'on doit charger ou non une ancienne sauvegarde fait crash l'adversaire
|
- 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
|
- 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
|
- (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
|
- Si la fenêtre est fermé, l'erreur "delete_vao AttributeError: 'NoneType' object has no attribute 'current_context'" apparait parfois
|
||||||
|
|
||||||
- Autre :
|
4. Vérification :
|
||||||
- Tester sur Linux
|
- 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.core.error import InvalidBombPosition, PositionAlreadyShot
|
||||||
from source.gui.scene import GameResult
|
from source.gui.scene import GameResult
|
||||||
from source.gui.scene.abc import BaseGame
|
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.network.packet import *
|
||||||
from source.type import Point2D
|
from source.type import Point2D
|
||||||
from source.utils import StoppableThread
|
from source.utils import StoppableThread
|
||||||
|
@ -292,6 +292,13 @@ class Game(BaseGame):
|
||||||
# sauvegarde la bombe dans l'historique
|
# sauvegarde la bombe dans l'historique
|
||||||
self.history.append((False, packet.position))
|
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
|
# envoie le résultat à l'autre joueur
|
||||||
PacketBombState(position=packet.position, bomb_state=bomb_state).send_connection(self.connection)
|
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
|
# sauvegarde la bombe dans l'historique
|
||||||
self.history.append((True, packet.position))
|
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:
|
if packet.bomb_state is BombState.WON:
|
||||||
# si cette bombe a touché le dernier bateau, alors l'on a gagné
|
# si cette bombe a touché le dernier bateau, alors l'on a gagné
|
||||||
self.game_end(won=True)
|
self.game_end(won=True)
|
||||||
|
|
|
@ -24,8 +24,6 @@ class GameResult(Popup):
|
||||||
image=texture.Result.Style1.get("victory" if won else "defeat")
|
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
|
# TODO: rendre l'image transparente si possible
|
||||||
|
|
||||||
from source.gui.scene import MainMenu
|
from source.gui.scene import MainMenu
|
||||||
|
|
|
@ -6,15 +6,36 @@ import pyglet
|
||||||
|
|
||||||
class SoundType(ABC):
|
class SoundType(ABC):
|
||||||
loaded_sound: dict[Path, pyglet.media.Source] = {}
|
loaded_sound: dict[Path, pyglet.media.Source] = {}
|
||||||
|
player: pyglet.media.Player
|
||||||
|
|
||||||
|
def __init_subclass__(cls, **kwargs):
|
||||||
|
cls.player = pyglet.media.Player()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_sound(cls, path: Path) -> pyglet.media.Source:
|
def get_sound(cls, path: Path) -> pyglet.media.Source:
|
||||||
if (sound := cls.loaded_sound.get(path)) is None:
|
if (sound := cls.loaded_sound.get(path)) is None:
|
||||||
|
# charge le son
|
||||||
sound = pyglet.media.load(path)
|
sound = pyglet.media.load(path)
|
||||||
cls.loaded_sound[path] = sound
|
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
|
return sound
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def __get__(self, instance, owner) -> pyglet.image.AbstractImage:
|
def __get__(self, instance, owner) -> pyglet.image.AbstractImage:
|
||||||
pass
|
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