Salle d'Attente
La page Salle d'Attente (WaitingRoomPage) affiche les joueurs ayant rejoint la partie et permet à l'hôte de lancer le jeu une fois que tous les joueurs sont prêts.
WaitingRoomPage
Type : ConsumerStatefulWidget
State : _WaitingRoomPageState extends ConsumerState(WaitingRoomPage)
Propriétés de constructeur
| Propriété | Type | Description |
|---|---|---|
mode |
String |
Mode de la salle ("create" ou "join") |
Propriétés d'état
| Propriété | Type | Description |
|---|---|---|
maxPlayers |
int |
Nombre maximum de joueurs (constante: 6) |
playerNameToKick |
String? |
Nom du joueur à expulser (pour confirmation) |
_assetPreloader |
AssetPreloaderService |
Service de préchargement des assets du jeu |
_isStartingGame |
bool |
Indique si le jeu est en cours de démarrage |
gridLimits |
Map(int, int) | Limites de joueurs par taille de grille |
_playerAvatarCache |
Map(String, String?) | Cache des URLs d'avatars |
Méthodes
initState()
Description : Initialise la page, configure les écouteurs et précharge les assets.
Actions :
- Réinitialise le flag de sortie
- Configure les écouteurs Socket.IO
- Configure l'écouteur de démarrage de partie
- Précharge les assets du jeu
Retour : void
dispose()
Description : Nettoie les ressources et le cache.
Retour : void
_preloadGameAssets()
Description : Précharge tous les assets du jeu (sprites, images, etc.).
Retour : Future
void _setupListeners()
Description : Configure les écouteurs initiaux pour le provider de game view.
Action : Initialise le provider avec le code de partie et le nom du joueur
Retour : void
void _setupGameStartListener()
Description : Configure l'écouteur pour le démarrage de la partie.
Event : onGameStart (via waitingRoomNotifier)
Action : Navigue vers GameViewPage quand la partie commence
Retour : void
void _showErrorPopup(String message)
Description : Affiche un popup d'erreur.
Retour : void
void _showPlayerKickedPopup(String message)
Description : Affiche un popup d'expulsion et redirige vers HomePage.
Retour : void
void _showGameCancelledPopup(String message)
Description : Affiche un popup d'annulation de partie et redirige vers HomePage.
Retour : void
void _focusOnGeneralChannel()
Description : Active le canal de chat général après avoir quitté la salle.
Retour : void
_startGame()
Description : Lance la partie (hôte uniquement).
Validations :
- Au moins 2 joueurs
- Assets préchargés
- Pas déjà en cours de démarrage
Action : Appelle waitingRoomNotifier.startGame()
Retour : Future
_leaveWaitingRoom()
Description : Quitte la salle d'attente.
Actions :
- Définit le flag de sortie
- Quitte la salle via Socket.IO
- Navigue vers HomePage
- Focus sur le canal général
Retour : Future
void _showLeaveConfirmationDialog()
Description : Affiche un dialogue de confirmation avant de quitter.
Retour : void
void _showKickConfirmationDialog(String playerName)
Description : Affiche un dialogue de confirmation avant d'expulser un joueur.
Paramètres :
playerName: Nom du joueur à expulser
Retour : void
_kickPlayer(String playerName)
Description : Expulse un joueur de la salle (hôte uniquement).
Action : Appelle waitingRoomNotifier.kickPlayer(playerName)
Retour : Future
bool _isHost()
Description : Vérifie si le joueur actuel est l'hôte de la partie.
Retour : bool
bool _isGameFull()
Description : Vérifie si la partie a atteint le nombre maximum de joueurs selon la taille de grille.
Retour : bool
bool _canStartGame()
Description : Vérifie si la partie peut être lancée.
Conditions :
- Au moins 2 joueurs
- Pas déjà en train de démarrer
Retour : bool
String? _getPlayerAvatarUrl(String playerName)
Description : Récupère l'URL d'avatar d'un joueur (avec cache).
Retour : String?
Widget _buildHeader()
Description : Construit l'en-tête avec titre et bouton quitter.
Retour : Widget
Widget _buildGameInfo(OnGoingGameModel game)
Description : Construit la section d'informations de la partie.
Contenu :
- Code de la partie (4 chiffres)
- Nom du jeu
- Hôte
- Visibilité
- Drop-in/drop-out
- Droit d'entrée
Retour : Widget
Widget _buildPlayersList(OnGoingGameModel game)
Description : Construit la liste des joueurs avec leurs avatars.
Retour : Widget
Widget _buildPlayerCard(PlayerModel player)
Description : Construit une carte de joueur.
Contenu :
- Avatar
- Nom
- Badge "HÔTE" si applicable
- Bouton expulser (visible pour l'hôte, sauf pour lui-même)
Retour : Widget
Widget _buildStartButton()
Description : Construit le bouton de démarrage de partie (hôte uniquement).
Retour : Widget
Éléments visuels
En-tête
- Titre : "SALLE D'ATTENTE" centré
- Bouton Quitter : Icône de porte de sortie (coin supérieur droit)
- Affiche dialogue de confirmation
- Retourne à HomePage
Informations de la partie
- Code de partie : Affiché en grand avec icône de copie
- 4 chiffres
- Copiable dans le presse-papiers
- Détails :
- Nom du jeu
- Hôte : Nom de l'admin
- Visibilité : Public/Amis avec icône
- Drop-in/out : Icône si activé
- Droit d'entrée : Montant en coins (si > 0)
Liste des joueurs
- Grille 2 colonnes : Cartes de joueurs
- Carte de joueur :
- Avatar du joueur (circulaire)
- Nom du joueur
- Badge "HÔTE" si admin
- Bouton expulser (icône X rouge) :
- Visible seulement pour l'hôte
- Pas affiché pour l'hôte lui-même
- Affiche confirmation avant expulsion
Bouton de démarrage
- Visible : Seulement pour l'hôte
- Texte : "LANCER LA PARTIE"
- État :
- Actif si au moins 2 joueurs
- Désactivé sinon
- Message : "Minimum 2 joueurs requis"
Overlays
- UserProfileWidget : Profil utilisateur
- ChatboxWidget : Chat
- HelpButtonWidget : Aide
- HelpPopupWidget : Aide contextuelle
- GameLoadingOverlay : Affichage pendant le démarrage
Dialogues
- Confirmation de départ : "Êtes-vous sûr de vouloir quitter?"
- Confirmation d'expulsion : "Expulser [nom du joueur]?"
- Expulsion : "Vous avez été expulsé de la partie"
- Annulation : "La partie a été annulée par l'hôte"
Composants utilisés
TwoButtonPopup
Popup avec deux boutons (confirmation/annulation).
OneButtonPopup
Popup avec un seul bouton (notification).
UserProfileWidget
Widget de profil utilisateur.
ChatboxWidget
Widget de chat.
HelpButtonWidget
Bouton d'aide.
HelpPopupWidget
Popup d'aide.
GameLoadingOverlay
Overlay de chargement pendant le démarrage.
Providers utilisés
waitingRoomNotifierProvider
Type : StateNotifierProvider(WaitingRoomNotifier, WaitingRoomState)
Provider gérant l'état de la salle d'attente.
WaitingRoomState
| Propriété | Type | Description |
|---|---|---|
currentGame |
OnGoingGameModel? |
Partie actuelle |
currentPlayer |
PlayerModel? |
Joueur actuel |
isLeaving |
bool |
Si le joueur est en train de quitter |
errorMessage |
String? |
Message d'erreur |
WaitingRoomNotifier - Méthodes
void resetLeavingFlag()
Description : Réinitialise le flag de sortie.
Retour : void
startGame()
Description : Lance la partie (hôte uniquement).
Event Socket : Envoie "startGame"
Retour : Future
leaveWaitingRoom(String gameCode)
Description : Quitte la salle d'attente.
Event Socket : Envoie "leaveWaitingRoom"
Retour : Future
kickPlayer(String playerName)
Description : Expulse un joueur (hôte uniquement).
Event Socket : Envoie "kickPlayer"
Retour : Future
void clearError()
Description : Efface le message d'erreur.
Retour : void
void listenForGameStart(Function(OnGoingGameModel) callback)
Description : Écoute l'event de démarrage de partie.
Event : "gameStarted"
Retour : void
void setCurrentGame(OnGoingGameModel game)
Description : Définit la partie actuelle.
Retour : void
void setCurrentPlayer(PlayerModel player)
Description : Définit le joueur actuel.
Retour : void
gameViewProvider(providerKey)
Type : StateNotifierProvider(GameViewNotifier, GameViewState)
Provider initialisé pour préparer la game view.
chatNotifierProvider
Type : StateNotifierProvider(ChatNotifier, ChatState)
Provider du chat.
friendsNotifierProvider
Type : StateNotifierProvider(FriendsNotifier, FriendsState)
Provider des amis.
userProfileProvider
Type : Provider(UserProfileEntity?)
Provider du profil utilisateur.
translationProvider
Type : Provider(TranslationWrapper)
Provider de traduction.
themeNotifierProvider
Type : StateNotifierProvider(ThemeNotifier, ThemeState)
Provider de thème.
helpPopupProvider
Type : StateNotifierProvider(HelpPopupNotifier, HelpPopupState)
Provider d'aide.
Écouteurs Socket.IO
Les events Socket.IO sont gérés via le WaitingRoomNotifier :
Events reçus
gameStarted
Description : La partie est lancée par l'hôte.
Payload : OnGoingGameModel
Action : Navigation vers GameViewPage
playerJoined
Description : Un nouveau joueur rejoint la salle.
Payload : PlayerModel
Action : Mise à jour de la liste des joueurs
playerLeft
Description : Un joueur quitte la salle.
Payload : playerName
Action : Retrait du joueur de la liste
playerKicked
Description : Un joueur est expulsé.
Payload : playerName
Action : Si c'est le joueur actuel, affiche popup et redirige vers HomePage
gameCancelled
Description : L'hôte annule la partie.
Action : Affiche popup et redirige tous les joueurs vers HomePage
gameLockUpdated
Description : Le statut de verrouillage de la partie change (drop-in/drop-out).
Payload : isLocked
Action : Met à jour l'état de la partie
Events envoyés
startGame
Description : Lancé par l'hôte pour démarrer la partie.
Payload : gameCode
leaveWaitingRoom
Description : Le joueur quitte la salle.
Payload : gameCode, playerName
kickPlayer
Description : L'hôte expulse un joueur.
Payload : gameCode, playerName
Navigation
- Quitter :
AppRoutes.home.path→HomePage - Expulsé :
AppRoutes.home.path→HomePage - Partie annulée :
AppRoutes.home.path→HomePage - Partie lancée :
AppRoutes.gameView.path→GameViewPage- Paramètres :
gameCode: Code de la partieplayerName: Nom du joueurgameData: Données complètes de la partie (JSON)sessionId: ID de session unique (timestamp en microsecondes)
- Paramètres :
Préchargement des assets
Le service AssetPreloaderService précharge tous les assets nécessaires au jeu :
- Sprites des personnages
- Tuiles de la grille
- Icônes d'items
- Images de portes
- Effets visuels
Timing : Le préchargement commence dès l'entrée dans la salle d'attente, permettant un démarrage instantané du jeu.
Limites de joueurs
| Taille de grille | Joueurs max |
|---|---|
| 10x10 | 2 |
| 15x15 | 4 |
| 20x20 | 6 |
Ces limites sont respectées automatiquement. Le bouton de démarrage est désactivé si pas assez de joueurs.
Gestion des rôles
Hôte (Admin)
- Peut lancer la partie
- Peut expulser des joueurs
- Peut annuler la partie (en quittant)
- Badge "HÔTE" affiché
Joueur normal
- Peut seulement quitter la salle
- Attend que l'hôte lance la partie
Comportement du code de partie
Le code de partie (4 chiffres) est affiché en grand et peut être copié dans le presse-papiers en cliquant dessus. Cela permet de partager facilement le code avec des amis.
Gestion de la sortie
Quand un joueur quitte la salle:
- Flag
isLeavingactivé - Event Socket.IO envoyé
- Navigation vers HomePage
- Focus sur le canal général
- Si c'était l'hôte, la partie est automatiquement annulée
Session ID
Lors du démarrage de la partie, un session ID unique est généré :
final sessionId = DateTime.now().microsecondsSinceEpoch.toString();
Cet ID est utilisé pour identifier de manière unique la session de jeu du joueur et éviter les conflits en cas de reconnexion.