/// <summary> /// Fonction retournant le niveau de résistance aux déplacements en fonction de la couleur du pixel de tuile /// à la position donnée. /// </summary> /// <param name="position">Position du pixel en coordonnées du monde.</param> /// <returns>Facteur de résistance entre 0.0f (aucune résistance) et 1.0f (résistance maximale).</returns> public float CalculerResistanceAuMouvement(Vector2 position) { Rectangle joueurRect = new Rectangle((int)this.joueur.PositionPourCollisions.X - 2, (int)this.joueur.PositionPourCollisions.Y - 2, 5, 5); foreach (Bloc bloc in this.listeBloc) { if (joueurRect.Intersects(bloc.AireOccupe)) { if (this.maBloc != bloc) { this.maBloc = bloc; this.contPousseBloc = 0; } this.contPousseBloc++; if (this.contPousseBloc > 20 && this.ValiderDeplacementBloc(bloc)) { this.GestionBloc(); } return 1.0f; } } foreach (Porte porte in this.listePorte) { if (!porte.Ouvert) { if (joueurRect.Intersects(porte.Barre)) { if (porte.PorteClef && this.joueur.Clef) { porte.Ouvert = true; this.portesClefOuvert[0] = true; this.boolClef = false; this.joueur.Clef = false; } else { return 1.0f; } } } } foreach (PorteHorizontale porte in this.listePorteHorizontale) { if (!porte.Ouvert) { if (joueurRect.Intersects(porte.Barre)) { return 1.0f; } } } // Extraire la couleur du pixel correspondant à la position donnée dans privTuilesCollisions. Color pixColor = this.monde.CouleurDeCollision(position); // Déterminer le niveau de résistance en fonction de la couleur if (pixColor == Color.White) { return 0.0f; } else if (pixColor == Color.Blue) { return 0.9f; } else { return 1.0f; } }
/// <summary> /// Verifie que la position finale du bloc est valide. (Il ne rentre pas dans une mûr, porte, ou autre bloc.) /// </summary> /// <param name="bloc">Le bloc à tester.</param> /// <returns>Return false pour valider le deplacement du joueur</returns> private bool ValiderDeplacementBloc(Bloc bloc) { if (this.joueur.Direction == Personnage.Directions.NordEst || this.joueur.Direction == Personnage.Directions.NordOuest || this.joueur.Direction == Personnage.Directions.SudEst || this.joueur.Direction == Personnage.Directions.SudOuest) { return false; } Vector2 destV = bloc.Position; switch (this.joueur.Direction) { case Personnage.Directions.Nord: destV.Y -= 28; break; case Personnage.Directions.Est: destV.X += 28; break; case Personnage.Directions.Sud: destV.Y += 28; break; case Personnage.Directions.Ouest: destV.X -= 28; break; default: // Si le joueur se déplace sur un angle, il ne peut pas déplacer le bloc. return false; } if ((this.monde.CouleurDeCollision(destV) != Color.White && this.monde.CouleurDeCollision(destV) != Color.Blue) || destV.Y < 95 || destV.Y > 505 || destV.X < 95 || destV.X > 505) { return false; } Rectangle destBloc = new Rectangle((int)destV.X - 14, (int)destV.Y - 14, 28, 28); foreach (Bloc bloc1 in this.listeBloc) { if (destBloc.Intersects(bloc1.AireOccupe)) { return false; } } return true; }
/// <summary> /// Fonction qui load tout les elements de map 1-2 /// </summary> private void LoadMap12() { this.ClearMap(); Bloc bloc0 = new Bloc(106, 272); bloc0.BoundsRect = new Rectangle(64, 230, 84, 84); Bloc bloc1 = new Bloc(134, 300); bloc1.BoundsRect = new Rectangle(92, 258, 84, 84); Bloc bloc2 = new Bloc(106, 328); bloc2.BoundsRect = new Rectangle(64, 286, 84, 84); this.listeBloc.Add(bloc0); this.listeBloc.Add(bloc1); this.listeBloc.Add(bloc2); Ogre ogre = new Ogre(new Vector2(152, 144)); this.listeOgres.Add(ogre); Ogre ogre1 = new Ogre(new Vector2(444, 144)); this.listeOgres.Add(ogre1); OgreMouvement ogre2 = new OgreMouvement(new Vector2(350, 350)); this.listeOgres.Add(ogre2); ogre2.BoundsRect = new Rectangle(300, 300, 193, 215); Switch switch1 = new Switch(134, 272); this.listeSwitch.Add(switch1); switch1.Type = Switch.Types.Nord; Switch switch2 = new Switch(162, 300); this.listeSwitch.Add(switch2); switch2.Type = Switch.Types.Est; Porte porteNord = new Porte(300, 75, Porte.Directions.Nord); porteNord.Ouvert = true; // fermé au prochaine Update, invoque le son de fermeture this.listePorte.Add(porteNord); PorteHorizontale porteEst = new PorteHorizontale(525, 300, PorteHorizontale.Directions.Est); porteEst.Ouvert = true; // fermé au prochaine Update, invoque le son de fermeture porteEst.Direction = PorteHorizontale.Directions.Est; this.listePorteHorizontale.Add(porteEst); }
/// <summary> /// Fonction qui load tout les elements de map 1-3 /// </summary> private void LoadMap13() { this.ClearMap(); Bloc bloc0 = new Bloc(404, 150); Bloc bloc1 = new Bloc(404, 175); bloc0.BoundsRect = bloc1.BoundsRect = new Rectangle(362, 100, 84, 415); Ogre ogre = new Ogre(new Vector2(210, 144)); this.listeOgres.Add(ogre); Ogre ogre1 = new Ogre(new Vector2(360, 144)); this.listeOgres.Add(ogre1); OgreMouvement ogre2 = new OgreMouvement(new Vector2(300, 300)); ogre2.BoundsRect = new Rectangle(240, 144, 120, 200); this.listeOgres.Add(ogre2); this.listeBloc.Add(bloc0); this.listeBloc.Add(bloc1); if (this.boolFood == true) { Food food = new Food(475, 120); this.listeFood.Add(food); } }
/// <summary> /// Fonction qui load tout les elements de map 1-1 /// </summary> private void LoadMap11() { this.ClearMap(); Bloc bloc0 = new Bloc(300, 105); bloc0.BoundsRect = new Rectangle(258, 63, 84, 84); this.listeBloc.Add(bloc0); OgreMouvement ogre = new OgreMouvement(new Vector2(400, 300)); ogre.BoundsRect = new Rectangle(91, 91, 415, 415); this.listeOgres.Add(ogre); }