/// <summary> /// Délégué : réponse à l'evt click gauche sur le rectangle, affichage des informations de la tuile /// </summary> /// <param name="sender"> le rectangle (la source) </param> /// <param name="e"> l'evt </param> unsafe void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var rectangle = sender as Rectangle; int column = Grid.GetColumn(rectangle); int row = Grid.GetRow(rectangle); Case.etatCase etat = MaPartie.getCarte().getCase(column, row).getEtatOccupation(); int nbUnite = -1; if (!(etat == Case.etatCase.libre)) { nbUnite = MaPartie.getCarte().getCase(column, row).getUnitsOnCase().Count(); } SelectionOperateur.etatSelection etatSelection = MaPartie.getSelectionOperateur().getEtatSelection(); if (nbUnite > 1 && etatSelection == SelectionOperateur.etatSelection.RienEstSelectionne) { ComboBox unite = new ComboBox(); unite.Width = 20; unite.Height = 20; for (int i = 0; i < nbUnite; i++) { unite.Items.Add(i); } Grid.SetColumn(unite, column); Grid.SetRow(unite, row); mapGrid.Children.Add(unite); unite.BringIntoView(); unite.MouseLeftButtonDown += new MouseButtonEventHandler(mouse_leave); unite.SelectionChanged += new SelectionChangedEventHandler(unite_SelectionChanged); unite.MouseLeftButtonDown += new MouseButtonEventHandler(mouse_leave); } else { traitement(column, row, 0); } // on arrête la propagation d'evt : sinon l'evt va jusqu'à la fenetre => affichage via "Window_MouseLeftButtonDown" e.Handled = true; }
/// <summary> /// Effectue le traitement lorsqu'un utilisateur clique sur une case /// </summary> /// <param name ="column">la colonne de la case</param> /// <param name ="row">la ligne de la case </param> /// <param name ="unitSelected">la nième unité de la case</param> unsafe private void traitement(int column, int row, int unitSelected) { int x1 = 0, y1 = 0, x2 = 0, y2 = 0; Case.etatCase etat = MaPartie.getCarte().getCase(column, row).getEtatOccupation(); if (!(etat == Case.etatCase.libre)) { List <UniteDeBase> listUnite = MaPartie.getCarte().getCase(column, row).getUnitsOnCase(); changeListeViewUnite(listUnite[unitSelected]); setGen(); UniteDeBase u = listUnite[unitSelected]; listUnite.RemoveAt(unitSelected); listUnite.Insert(0, u); } else { initListUnite(); } // la var etat est soit libre soit joueur1 soit joueur2 SelectionOperateur.etatSelection etatSelection = MaPartie.getSelectionOperateur().getEtatSelection(); // la var etatSelection est soit RienEstSelectionne soit UniteDeDepartDelectionnee soit UniteDarriveeSelectionnee //(normalement l'utilisateur n'aura pas le temps de cliquer sur quoi que ce soit lors de la transition de l'etat UniteDarriveeSelectionnee vers RienEstSelectionne) switch (etat) { case Case.etatCase.libre: if (etatSelection != SelectionOperateur.etatSelection.UniteDeDepartDelectionnee) { MessageBox.Show("Attention, vous avez sélectionné une case vide !"); // se produit surtout quand on est dans l'etat RienEstSelectionne et que l'on essaie de jouer une case qui est vide... MaPartie.getSelectionOperateur().FinDeSelection(); } else //ici on est sur d'être dans l'etat UniteDeDepartDelectionnee { // MessageBox.Show("Vous déplacez votre unité vers une case vide."); MaPartie.getSelectionOperateur().selectCase(column, row); // donc ici on passe dans l'etat UniteDarriveeSelectionnee MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); //donc il n'y a pas besoin de vérifier isSecondSelection1 cependant il faut conserver l'opération getSelectedCase Case casedep = MaPartie.getCarte().getCase(x1, y1); Case casearr = MaPartie.getCarte().getCase(x2, y2); Peuple p; Joueur j; int numJoueur; if (MaPartie.getJoueur1ALaMain()) { p = MaPartie.joueur1.getPeuple(); j = MaPartie.joueur1; numJoueur = 1; } else { p = MaPartie.joueur2.getPeuple(); j = MaPartie.joueur2; numJoueur = 2; } MaPartie.getCarte().moveProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, j, numJoueur); clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); } break; case Case.etatCase.joueur1: if (!MaPartie.getJoueur1ALaMain()) { //le joueur2 a cliqué sur une case du joueur1 if (etatSelection != SelectionOperateur.etatSelection.UniteDeDepartDelectionnee) { MessageBox.Show("Attention vous avez sélectionné une case appartenant au joueur adverse !"); MaPartie.getSelectionOperateur().FinDeSelection(); } else { MaPartie.getSelectionOperateur().selectCase(column, row); MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); Case casedep = MaPartie.getCarte().getCase(x1, y1); Case casearr = MaPartie.getCarte().getCase(x2, y2); Peuple p = MaPartie.joueur2.getPeuple(); Boolean doitSeDeplacer = MaPartie.getCarte().fightProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur2, MaPartie.joueur1); if (doitSeDeplacer) { MessageBox.Show("Vous avez déclenché un combat !"); } if (MaPartie.joueur2.getUnite().Count == 0 || MaPartie.joueur1.getUnite().Count == 0) { MessageBox.Show("La Partie est finie !"); MessageBox.Show(MaPartie.evaluerFinDePartie()); } if (doitSeDeplacer) { MaPartie.getCarte().moveProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur2, 2); } clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); } } else { //le joueur1 a cliqué sur une case du joueur1 List <int> laList = MaPartie.getCarte().listeDesCasesPossibles(column, row, MaPartie.getCarte().getCase(column, row), MaPartie.joueur1.getPeuple().nomPeuple); updateRectSelection(laList); switch (etatSelection) { case SelectionOperateur.etatSelection.RienEstSelectionne: MaPartie.getSelectionOperateur().selectCase(column, row); /*Case caseSelectionnee = MaPartie.getCarte().getCase(column, row); * if (caseSelectionnee.getUnitsOnCase().Count == 0) * { * MaPartie.getSelectionOperateur().FinDeSelection(); * }*/ // listeDesCasesPossibles(int xdep, int ydep,int numJoueur, Peuple.NomPeuple nompeuple) break; case SelectionOperateur.etatSelection.UniteDeDepartDelectionnee: // dans ce cas il s'agit d'un déplacement d'une des unités du joueur vers une case où il a déjà des unités mais c'est autorisé MaPartie.getSelectionOperateur().selectCase(column, row); MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); Case casedep = MaPartie.getCarte().getCase(x1, y1); Case casearr = MaPartie.getCarte().getCase(x2, y2); Peuple p = MaPartie.joueur1.getPeuple(); MaPartie.getCarte().moveProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur1, 1); clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); break; case SelectionOperateur.etatSelection.UniteDarriveeSelectionnee: MessageBox.Show("Vous avez déjà sélectionné 2 cases !"); MaPartie.getSelectionOperateur().FinDeSelection(); break; } /* if (etatSelection != SelectionOperateur.etatSelection.UniteDarriveeSelectionnee) { * MaPartie.getSelectionOperateur().selectCase(column, row); * }else{ * MessageBox.Show("Vous avez déjà sélectionné 2 cases !"); //Ne devrait pas trop arriver * MaPartie.getSelectionOperateur().FinDeSelection(); * }*/ } break; case Case.etatCase.joueur2: if (MaPartie.getJoueur1ALaMain()) { //le joueur1 a cliqué sur une case du joueur2 if (etatSelection != SelectionOperateur.etatSelection.UniteDeDepartDelectionnee) { MessageBox.Show("Attention vous avez sélectionné une case appartenant au joueur adverse !"); MaPartie.getSelectionOperateur().FinDeSelection(); } else { MaPartie.getSelectionOperateur().selectCase(column, row); MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); Case casedep = MaPartie.getCarte().getCase(x1, y1); Case casearr = MaPartie.getCarte().getCase(x2, y2); Peuple p = MaPartie.joueur1.getPeuple(); Boolean doitSeDeplacer = MaPartie.getCarte().fightProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur1, MaPartie.joueur2); if (doitSeDeplacer) { MessageBox.Show("Vous avez déclenché un combat !"); } if (MaPartie.joueur2.getUnite().Count == 0 || MaPartie.joueur1.getUnite().Count == 0) { MessageBox.Show("La Partie est finie !"); MessageBox.Show(MaPartie.evaluerFinDePartie()); } if (doitSeDeplacer) { MaPartie.getCarte().moveProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur1, 1); } clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); } } else { //le joueur2 a cliqué sur une case du joueur2 clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); List <int> laList2 = MaPartie.getCarte().listeDesCasesPossibles(column, row, MaPartie.getCarte().getCase(column, row), MaPartie.joueur2.getPeuple().nomPeuple); updateRectSelection(laList2); switch (etatSelection) { case SelectionOperateur.etatSelection.RienEstSelectionne: MaPartie.getSelectionOperateur().selectCase(column, row); /*Case caseSelectionnee = MaPartie.getCarte().getCase(column, row); * if (caseSelectionnee.getUnitsOnCase().Count == 0) * { * MaPartie.getSelectionOperateur().FinDeSelection(); * }*/ break; case SelectionOperateur.etatSelection.UniteDeDepartDelectionnee: // dans ce cas il s'agit d'un déplacement d'une des unités du joueur vers une case où il a déjà des unités mais c'est autorisé MaPartie.getSelectionOperateur().selectCase(column, row); MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); Case casedep = MaPartie.getCarte().getCase(x1, y1); Case casearr = MaPartie.getCarte().getCase(x2, y2); Peuple p = MaPartie.joueur2.getPeuple(); MaPartie.getCarte().moveProcessing(x1, y1, x2, y2, casedep, casearr, p.nomPeuple, MaPartie.joueur2, 2); clearEllipses(); updateGraphiqueUnite(MaPartie.joueur1, 1); updateGraphiqueUnite(MaPartie.joueur2, 2); break; case SelectionOperateur.etatSelection.UniteDarriveeSelectionnee: MessageBox.Show("Vous avez déjà sélectionné 2 cases !"); MaPartie.getSelectionOperateur().FinDeSelection(); break; } /*if (etatSelection != SelectionOperateur.etatSelection.UniteDarriveeSelectionnee) * { * MaPartie.getSelectionOperateur().selectCase(column, row); * } * else * { * MessageBox.Show("Vous avez déjà sélectionné 2 cases !"); * MaPartie.getSelectionOperateur().FinDeSelection(); * }*/ } break; } // V2 : gestion avec Binding // Mise à jour du rectangle selectionné => le label sera mis à jour automatiquement par Binding Grid.SetColumn(selectionRectangle, column); Grid.SetRow(selectionRectangle, row); selectionRectangle.Visibility = System.Windows.Visibility.Visible; // V1 : gestion avec evts classiques //if (selectedVisual != null) // selectedVisual.StrokeThickness = 1; //selectedVisual = rectangle; //selectedVisual.Tag = tile; // Tag : ref par defaut sur la tuile logique //rectangle.StrokeThickness = 3; //infoLabel.Content = String.Format("[{0:00} - {1:00}] {2} Fer : {3}", column, row, tile, tile.Iron); Boolean isSecondSelection = MaPartie.getSelectionOperateur().getSelectedCases(&x1, &y1, &x2, &y2); if (isSecondSelection) { //MessageBox.Show("Bravo vous avez bien sélectionner 2 deux cases: " + x1.ToString() + " " + y1.ToString() + " " + x2.ToString() + " " + y2.ToString()); MaPartie.getSelectionOperateur().FinDeSelection(); } }