/// <summary> /// Méthode permettant de reset la fenêtre en cours et ses variables /// </summary> private void Reset() { Victoire.Visible = false; Instructions.Visible = false; temps.Text = "100"; temps.Location = new Point(this.ClientSize.Width / 2 - temps.Width / 2, temps.Location.Y); raquette.Location = new Point(raquette.Location.X, this.Height / 2 - raquette.Height / 2); scoreClient = 0; scoreServer = 0; score.Text = scoreServer + "-" + scoreClient; if (joueur == 0) { ball.Visible = true; ball.Location = new Point(this.ClientSize.Width / 2 - ball.Width / 2, this.ClientSize.Height / 2 - ball.Height / 2); b = new Balle(ball.Location.X, ball.Location.Y); b.EnDehors = false; // Envois de l'information de reset à l'adversaire dt = new DataTransit(); dt.Reset = true; ServerClass.prepareSendData(dt); } else { ball.Visible = false; b.Vitesse = 0; } timerMvmt.Enabled = true; timerChrono.Enabled = false; }
/// <summary> /// Constructeur de la fenêtre de la partie /// </summary> /// <param name="joueur">Identifiant permettant de différencier client et serveur</param> /// <param name="form">Fenêtre de configuration bluetooth active</param> /// <param name="nameJoueur">Nom du joueur</param> public Partie(int joueur, ConfigurationPanel form, String nameJoueur) { // Initialisation des variables scoreServer = 0; scoreClient = 0; this.joueur = joueur; this.form = form; // Initialisation des composant graphiques InitializeComponent(); temps.Location = new Point(this.ClientSize.Width / 2 - temps.Width / 2, temps.Location.Y); score.Location = new Point(this.ClientSize.Width / 2 - score.Width / 2, score.Location.Y); ball.Location = new Point(this.ClientSize.Width / 2 - ball.Width / 2, this.ClientSize.Height / 2 - ball.Height / 2); // Création d'un objet Balle permettant de manipuler le composant graphique ball b = new Balle(ball.Location.X, ball.Location.Y); // Initialisation de l'évènement des touches du clavier KeyDown += new KeyEventHandler(Partie_KeyDown); // Si le joueur est du côté client if (joueur == 1) { // On cache la balle et on change place la raquette ball.Visible = false; raquette.Location = new Point(this.ClientSize.Width - 46, this.ClientSize.Height / 2 - raquette.Height / 2); // On retourne les images affichées Image img = raquette.Image; img.RotateFlip(RotateFlipType.Rotate180FlipNone); raquette.Image = img; Image img_terrain = this.BackgroundImage; img_terrain.RotateFlip(RotateFlipType.Rotate180FlipNone); this.BackgroundImage = img_terrain; // On attribut le nom du joueur client nameClient = nameJoueur; nameServer = ""; } else { // On place la raquette raquette.Location = new Point(raquette.Location.X, this.ClientSize.Height / 2 - raquette.Height / 2); // On attribut le nom du joueur serveur nameServer = nameJoueur; nameClient = ""; } }
/// <summary> /// Méthode s'exécutant à chaque tour du timer 1 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer1_Tick(object sender, EventArgs e) { int bh = ball.Height; int bw = ball.Width; int rx = raquette.Location.X; int ry = raquette.Location.Y; int rh = raquette.Height; int rw = raquette.Width; // Modification de la position de la raquette if (GetAsyncKeyState(Keys.Up) != 0 && ry > 0) { ry -= 10; } if (GetAsyncKeyState(Keys.Down) != 0 && ry + rh < this.ClientSize.Height) { ry += 10; } try { raquette.Location = new Point(rx, ry); } catch (InvalidOperationException ex) { Console.WriteLine(ex.Message); } // Si la partie de l'adversaire est arrétée, on ferme la partie de ce côté if (ServerClass.dt.Alive == false || ClientClass.dt.Alive == false) { this.Partie_FormClosing(null, null); } // Si aucune information sur la balle n'est arrivée par bluetooth et que la balle est en mouvement if (ServerClass.dt.BallePro == null && ClientClass.dt.BallePro == null) { if (b.Vitesse != 0) { // Modification de l'angle de la balle celle-ci tape en haut ou en bas if (b.Y < 0 || b.Y + bh > this.ClientSize.Height) { b.Angle = 360 - b.Angle; } // Si l'on est côté serveur if (joueur == 0) { // Modification de l'angle de la balle si celle-ci tape la raquette if (b.X < rx + rw && b.X > rx && b.Y < ry + rh && b.Y + bh > ry) { if (b.Angle > 180) { b.Angle = 540 - b.Angle; } else { b.Angle = 180 - b.Angle; } // Modification de l'angle selon l'endroit où la balle arrive sur la raquette if (b.Y + bh > ry && b.Y + bh / 2 < ry + rh / 2) { b.Angle -= (int)((double)((double)rh / 2 - ((b.Y + bh) - ry)) / ((double)rh / 2) * 60); } else { b.Angle += (int)((double)(b.Y - (ry + rh / 2)) / ((double)rh / 2) * 60); } if (b.Angle > 60 && b.Angle < 180) { b.Angle = 60; } else if (b.Angle < 300 && b.Angle > 180) { b.Angle = 300; } // Augmentation de la vitesse de la balle b.Accelere(); } // Si la balle sort du terrain vers le joueur adverse if (b.X > this.ClientSize.Width) { // La balle devient invisible et sa position est modifée ball.Visible = false; b.Y = (double)ball.Location.Y / (double)this.ClientSize.Height; // Envoi des données vers le client DataTransit dt = new DataTransit(); dt.BallePro = b; dt.Alive = true; ServerClass.prepareSendData(dt); // La balle est stoppée b.Vitesse = 0; } // Si le joueur ne parvient pas à toucher la balle else if (b.X < 0) { // La balle est cachée ball.Visible = false; // Le score est modifié scoreClient++; score.Text = scoreServer + "-" + scoreClient; // Les informations sont envoyées à l'adversaire b.EnDehors = true; b.Vitesse = 0; DataTransit dt = new DataTransit(); dt.BallePro = b; dt.Alive = true; ServerClass.prepareSendData(dt); // Le chrono s'arrête timerChrono.Enabled = false; b.EnDehors = false; } } else { // Modification de l'angle de la balle si celle-ci tape la raquette if (b.X + bw < rx + rw && b.X + bw > rx && b.Y < ry + rh && b.Y + bh > ry) { if (b.Angle > 180) { b.Angle = 540 - b.Angle; } else { b.Angle = 180 - b.Angle; } // Modification de l'angle selon l'endroit où la balle arrive sur la raquette if (b.Y + bh > ry && b.Y + bh / 2 < ry + rh / 2) { b.Angle += (int)((double)((double)rh / 2 - ((b.Y + bh) - ry)) / ((double)rh / 2) * 60); } else { b.Angle -= (int)((double)(b.Y - (ry + rh / 2)) / ((double)rh / 2) * 60); } if (b.Angle > 240 && b.Angle < 360) { b.Angle = 240; } else if (b.Angle < 120 && b.Angle > 0) { b.Angle = 120; } } // Si la balle sort du terrain vers le joueur adverse if (b.X < 0) { // La balle devient invisible et sa position est modifée ball.Visible = false; b.Y = (double)ball.Location.Y / (double)this.ClientSize.Height; // Envoi des données vers le serveur dt = new DataTransit(); dt.BallePro = b; dt.Alive = true; ClientClass.prepareSendData(dt); b.Vitesse = 0; } // Si le joueur ne parvient pas à toucher la balle else if (b.X > this.ClientSize.Width) { // La balle est cachée ball.Visible = false; // Le score est modifié scoreServer++; score.Text = scoreServer + "-" + scoreClient; // Les informations sont envoyées à l'adversaire b.EnDehors = true; b.Vitesse = 0; dt = new DataTransit(); dt.BallePro = b; dt.Alive = true; ClientClass.prepareSendData(dt); // Le chrono est arrété timerChrono.Enabled = false; b.EnDehors = false; } } // Modification de la position de la balle b.Delta(); try { ball.Location = new Point(b.X, (int)b.Y); } catch (InvalidOperationException ex) { Console.WriteLine(ex.Message); } } } else { // La balle est visible ball.Visible = true; // SI l'on est côté serveur if (joueur == 0) { // Mise à jour de la balle b = ServerClass.dt.BallePro; b.X = this.ClientSize.Width; b.Y = b.Y * this.ClientSize.Height; // Si l'adversaire n'avait pas pu renvoyer la balle if (b.EnDehors == true) { // Le chrono est stoppé timerChrono.Enabled = false; // Le score est modifié scoreServer++; score.Text = scoreServer + "-" + scoreClient; // La balle est réinitialisée pour un nouveau lancé ball.Location = new Point(this.ClientSize.Width / 2 - ball.Width / 2, this.ClientSize.Height / 2 - ball.Height / 2); b = new Balle(ball.Location.X, ball.Location.Y); b.EnDehors = false; } // On vide la variable de transfert de données ServerClass.dt.BallePro = null; } else { // Mise à jour de la balle b = ClientClass.dt.BallePro; b.X = 0; b.Y = b.Y * this.ClientSize.Height; // Si l'adversaire n'avait pas pu renvoyer la balle if (b.EnDehors == true) { // Le chrono est stoppé timerChrono.Enabled = false; // Le score est modifié scoreClient++; score.Text = scoreServer + "-" + scoreClient; // La balle est réinitialisée pour un nouveau lancé ball.Location = new Point(this.ClientSize.Width / 2 - ball.Width / 2, this.ClientSize.Height / 2 - ball.Height / 2); b = new Balle(ball.Location.X, ball.Location.Y); b.EnDehors = false; } // On vide la variable de transfert de données ClientClass.dt.BallePro = null; } } // Si l'on reçoit un message d'activation du timer par Bluetooth if (ServerClass.dt.Timer == true || ClientClass.dt.Timer == true) { // Relancement du chronomètre timerChrono.Enabled = true; // S'il manques un nom on le récupère if (nameClient == "" || nameServer == "") { if (joueur == 0) { nameClient = ServerClass.dt.NameJoueur; } else { nameServer = ClientClass.dt.NameJoueur; } } } }