/// <summary> /// Méthode permettant de déplacer l'image /// </summary> /// <param name="piece"></param> /// <param name="casMelange"></param> private void DeplacementSuivantPosition(Piece piece, bool casMelange) { if (piece.DeplacementHaut) { if (!(PiecePresente(piece.Coordonnee.Ligne - 1, piece.Coordonnee.Colonne))) { Grid.SetRow(piece.Image, piece.Coordonnee.Ligne - 1); piece.IndexPosition -= 1; if (!casMelange) { _partieEnCours.NombreDeplacement++; } } } if (piece.DeplacementBas) { if (!(PiecePresente(piece.Coordonnee.Ligne + 1, piece.Coordonnee.Colonne))) { Grid.SetRow(piece.Image, piece.Coordonnee.Ligne + 1); piece.IndexPosition += 1; if (!casMelange) { _partieEnCours.NombreDeplacement++; } } } if (piece.DeplacementGauche) { if (!(PiecePresente(piece.Coordonnee.Ligne, piece.Coordonnee.Colonne - 1))) { Grid.SetColumn(piece.Image, piece.Coordonnee.Colonne - 1); piece.IndexPosition -= _partieEnCours.TailleGrille; if (!casMelange) { _partieEnCours.NombreDeplacement++; } } } if (piece.DeplacementDroite) { if (!(PiecePresente(piece.Coordonnee.Ligne, piece.Coordonnee.Colonne + 1))) { Grid.SetColumn(piece.Image, piece.Coordonnee.Colonne + 1); piece.IndexPosition += _partieEnCours.TailleGrille; if (!casMelange) { _partieEnCours.NombreDeplacement++; } } } }
/// <summary> /// Méthode appelée lors de l'appui sur une image /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ImageTap(object sender, GestureEventArgs e) { //Récupération de la pièce correspondante à l'image cliquée int tailleListe = _partieEnCours.ListePieces.Count; Piece piececlique = new Piece(); for (int index = 0; index < tailleListe; index++) { var piece = _partieEnCours.ListePieces[index]; if (piece.Image.Equals(sender as Image)) { piececlique = piece; _partieEnCours.ListePieces.Remove(piece); tailleListe--; } } //Déplacement de la pièce DeplacementSuivantPosition(piececlique, false); //Calcul des nouveaux paramètres après déplacement piececlique.Ajuster(); //Ajout de la pièce à la nouvelle position avec les nouveaux paramètres dans la liste des pièces de la partie en cours _partieEnCours.ListePieces.Add(piececlique); //Détection de la fin de la partie (Image remise dans l'ordre) if (_partieEnCours.DetecterFinJeu()) { //Arrêt du chrono _partieEnCours.StopWatch.Stop(); _partieEnCours.CalculerScore(); //Stockage de la partie pour la passer à la page suivante PhoneApplicationService.Current.State["partie"] = _partieEnCours; NavigationService.Navigate(_casDefi ? new Uri("/Pages/DefiTerminePage.xaml", UriKind.Relative) : new Uri("/Pages/JeuTerminePage.xaml", UriKind.Relative)); } }
/// <summary> /// Méthode permttant de dire si une pièce est déplacable /// </summary> /// <param name="piece"></param> /// <returns>True si la pièce est déplacable</returns> private bool EstDeplacable(Piece piece) { if (piece.DeplacementHaut) { if (!(PiecePresente(piece.Coordonnee.Ligne - 1, piece.Coordonnee.Colonne))) { return(true); } } if (piece.DeplacementBas) { if (!(PiecePresente(piece.Coordonnee.Ligne + 1, piece.Coordonnee.Colonne))) { return(true); } } if (piece.DeplacementGauche) { if (!(PiecePresente(piece.Coordonnee.Ligne, piece.Coordonnee.Colonne - 1))) { return(true); } } if (piece.DeplacementDroite) { if (!(PiecePresente(piece.Coordonnee.Ligne, piece.Coordonnee.Colonne + 1))) { return(true); } } return(false); }
/// <summary> /// Méthode permettant le découpage de l'image, l'application des filtres /// </summary> private async void PreparerImage() { int tailleGrille; IsolatedStorageSettings.ApplicationSettings.TryGetValue("TailleGrille", out tailleGrille); int nombreFiltre; IsolatedStorageSettings.ApplicationSettings.TryGetValue("IndexFiltre", out nombreFiltre); //Création de la partie _partieEnCours = new Partie(tailleGrille, nombreFiltre); //Spécification du dataContext pour le Binding DataContext = _partieEnCours; //Création de la grille CreerGrille(_partieEnCours.TailleGrille); //Récupération de la UtilisateurImage WriteableBitmap imageSelectionne = (WriteableBitmap)PhoneApplicationService.Current.State["photo"]; _partieEnCours.Photo = imageSelectionne; //On choisit des filtres au hasard dans la liste du sdk pour la partie et suivant les paramètres choisis par l'utilisateur List <Filtre> listeFiltrePartie = new List <Filtre>(); for (int i = 0; i < _partieEnCours.NombreFiltre; i++) { Random random = new Random(); int indexRandom = random.Next(_listeFiltre.Count); listeFiltrePartie.Add(_listeFiltre[indexRandom]); _listeFiltre.Remove(_listeFiltre[indexRandom]); } //Préparation de l'image int compteur = 0; for (int i = 0; i < _partieEnCours.TailleGrille; i++) { for (int j = 0; j < _partieEnCours.TailleGrille; j++) { if (!(i == _partieEnCours.TailleGrille - 1 && j == _partieEnCours.TailleGrille - 1)) { //Découpage de la UtilisateurImage : TODO explication Photo photoDecoupe = new Photo(imageSelectionne.Crop(i * _largeurPiece, j * _hauteurPiece, _largeurPiece, _hauteurPiece), _largeurPiece, _hauteurPiece); //Application des filtres Random random2 = new Random(); int indexRandom2 = random2.Next(_partieEnCours.NombreFiltre); if (_partieEnCours.NombreFiltre != 0) { FilterEffect filterEffect = new FilterEffect(photoDecoupe.PhotoBuffer); filterEffect.Filters = new[] { listeFiltrePartie[indexRandom2].Type }; var renderer = new WriteableBitmapRenderer(filterEffect, photoDecoupe.PhotoSelectionne); photoDecoupe.PhotoSelectionne = await renderer.RenderAsync(); } Image image = new Image { Name = compteur.ToString(CultureInfo.InvariantCulture), Source = photoDecoupe.PhotoSelectionne }; Grid.SetRow(image, j); Grid.SetColumn(image, i); JeuGrid.Children.Add(image); Piece piece = new Piece(image); piece.IdFiltre = _partieEnCours.NombreFiltre != 0 ? listeFiltrePartie[indexRandom2].Id : 0; _partieEnCours.ListePieces.Add(piece); compteur++; } } } //Appel à la méthode de mélange Melange(); _partieEnCours.ListePiecesInitale = new List <Piece>(); foreach (var piece in _partieEnCours.ListePieces) { piece.Image.Tap += ImageTap; //Copie de la piece dans un nouvel objet pour éviter de modifier la valeur initiale de la piece Piece pieceInitiale = new Piece { Id = piece.Id, Image = piece.Image, Coordonnee = piece.Coordonnee, DeplacementHaut = piece.DeplacementHaut, DeplacementBas = piece.DeplacementBas, DeplacementGauche = piece.DeplacementGauche, DeplacementDroite = piece.DeplacementDroite, IndexPosition = piece.IndexPosition, IdFiltre = piece.IdFiltre }; //Ajout de l'objet dans la liste initiale utilisée ensuite pour créer le défi _partieEnCours.ListePiecesInitale.Add(pieceInitiale); } }
/// <summary> /// Permet de préparer l'image pour un défi /// </summary> private async void PreparerImageDefi() { //Récupération du défi DefiService defi = (DefiService)PhoneApplicationService.Current.State["defi"]; _partieEnCours = new Partie(defi.NombreFiltre); //Spécification du dataContext pour le Binding DataContext = _partieEnCours; //Calcul de la taille de la grille en fonction switch (defi.Composition.Count) { case 8: _partieEnCours.TailleGrille = 3; break; case 15: _partieEnCours.TailleGrille = 4; break; case 24: _partieEnCours.TailleGrille = 5; break; } CreerGrille(_partieEnCours.TailleGrille); int compteur = 0; for (int i = 0; i < _partieEnCours.TailleGrille; i++) { for (int j = 0; j < _partieEnCours.TailleGrille; j++) { if (!(i == _partieEnCours.TailleGrille - 1 && j == _partieEnCours.TailleGrille - 1)) { //Découpage de la UtilisateurImage Photo photoDecoupe = new Photo(new WriteableBitmap(Photo.DecodeImage(defi.ImageDefi)).Crop(i * _largeurPiece, j * _hauteurPiece, _largeurPiece, _hauteurPiece), _largeurPiece, _hauteurPiece); CompositionService composer = null; foreach (var c in defi.Composition) { if (c.IdPiece == compteur) { composer = c; } } if (defi.Composition[compteur].IdFiltre != 0) { FilterEffect filterEffect = new FilterEffect(photoDecoupe.PhotoBuffer); Filtre filtre = null; foreach (var filtre1 in _listeFiltre) { if (composer != null && filtre1.Id == composer.IdFiltre) { filtre = filtre1; } } if (filtre != null) { filterEffect.Filters = new[] { filtre.Type } } ; var renderer = new WriteableBitmapRenderer(filterEffect, photoDecoupe.PhotoSelectionne); photoDecoupe.PhotoSelectionne = await renderer.RenderAsync(); } Image image = new Image { Name = compteur.ToString(CultureInfo.InvariantCulture), Source = photoDecoupe.PhotoSelectionne }; //TODO Determiner les coordonees en fonction de l'index int[] coordonnees = Piece.CalculerCoordonnees(composer.IndexPosition, _partieEnCours.TailleGrille); Grid.SetColumn(image, coordonnees[0]); Grid.SetRow(image, coordonnees[1]); JeuGrid.Children.Add(image); Piece piece = new Piece(image, composer.IndexPosition); _partieEnCours.ListePieces.Add(piece); compteur++; } } } foreach (var piece in _partieEnCours.ListePieces) { piece.Image.Tap += ImageTap; } _indicator.IsIndeterminate = false; _indicator.IsVisible = false; }