Annuler une partie

A la conquête du jeu vidéo partie 11

Quitter côté client

Lorsque le joueur crée ou rejoint une partie, il a la possibilité d’annuler son action en cliquant sur le bouton « Quitter la partie », cela va se traduire par le déclenchement de l’événement event_quit_partie.

event_quit_partie(){
	if( this.current_partie ){
		this.send_to_server("message",{ action : "request_quit_partie" , params : { token : this.token , partie_id : this.current_partie } });
		//unbind de click
		$(".sub-menu").off("click.quit_partie");
	}
}

Quitter côté serveur

Au niveau du serveur, je crée la méthode request_quit_partie. Je vérifie que le joueur fait bien partie de la partie et qu’il est bien en état de la quitter, ensuite je le supprime de la partie et je réinitialise le tableau de validation. Si la partie ne contient plus aucun joueur, alors je supprime la partie, sinon j’avertis tous les autres joueurs qu’un des joueurs vient de quitter la partie. Et si il y a eu la moindre action, alors je mets à jour les parties pour les utilisateurs en état « free« .

request_quit_partie(user_socket, params){
	if( ( this.users[ params.token ].state == "join" || this.users[ params.token ].state == "valide" || this.users[ params.token ].state == "making" ) && this.users[ params.token ].current_partie == params.partie_id){
		//supression du joueurs
		delete this.parties[ params.partie_id ].list_players[ params.token ];
		//definis tous les joueurs de la partie comme non valide
		this.parties[ params.partie_id ].validation_players = {};
		
		//variable client
		this.users[ params.token ].current_partie = null;
		this.users[ params.token ].state = "free";
		
		//si un jour quitte la partie la map repasse en waiting automatiquement
		this.parties[ params.partie_id ].state = "waiting";
		
		//si la partie ne contient plus de joueur alors la supprimer
		if( Object.keys( this.parties[ params.partie_id ].list_players ).length == 0){
			delete this.parties[ params.partie_id ];	
		}else{				
			//envois un message au autre utilisateur de la partie pour rafraichir le nombre
			for(let token in this.parties[ params.partie_id ].list_players ){
				//envois à tous sauf à l'user
				if( user_socket.id != this.users[ token ].socket_id ){
					this.send_to_specific_client(this.users[token].socket_id, "message", { 
						action : "update_request_join_partie", 
						params :  this.get_list_players_for_preparation( this.parties[ params.partie_id ] )  
					});
				}
			}
		}
									
		//mettre à jour les parties pour les utilisateurs free 
		for(let token in this.users){
			if( token == params.token){
				//utilisateur courant
				this.send_to_client(user_socket, "message", { action : "response_request_quit_partie", params : { go_to : "home" , list_parties : this.get_client_list_parties() } });	
			}else if( this.users[ token ].state == "free" ){
				//utilisateur free
				this.send_to_specific_client(this.users[token].socket_id, "message", { action : "update_list_parties", params : this.get_client_list_parties() });	
			}
		}
	}
}

Démo

Voilà une première partie fonctionnelle, et je suis assez content du résultat. Maintenant je peux te présenter une vidéo qui montre le fonctionnement de l’interface et comment tout cela se goupille !

09/07/2016

Yann Vangampelaere - nouslesdevs -

Sinon jete un coup d’oeil aux autres catégories

Ma boîte aux lettres

Tu veux me demander quelque chose ?