/// <summary> /// Move the airplane /// </summary> /// <param name="aircraft"></param> public override void MoveAircraft(Aircraft aircraft) { //calcul la nouvelle position en x et y int destX = aircraft.destinationX; int destY = aircraft.destinationY; PassengerAircraft passAircraft = (PassengerAircraft)aircraft; FlyingState position = (FlyingState)passAircraft.CurrentState; double distance = Math.Sqrt((Math.Pow(destY - position.PosY, 2)) + (Math.Pow(destX - position.PosX, 2))); double tickRequired = distance / (passAircraft.Speed * 15); // Si le nombre de tick est plus grand que 1, deplacer l'avion if (tickRequired > 1) { double XbyTick = (destX - position.PosX) / tickRequired; double YbyTick = (destY - position.PosY) / tickRequired; position.PosX += Convert.ToInt32(XbyTick); position.PosY += Convert.ToInt32(YbyTick); } else // sinon, l'avion est a destination { aircraft.CurrentState.ChangeState(aircraft); } }
/// <summary> /// Move the aircraft /// </summary> /// <param name="aircraft"></param> public override void MoveAircraft(Aircraft aircraft) { //Calcul le deplacement en x et y de 1 tick de l'avion int destX = aircraft.destinationX; int destY = aircraft.destinationY; RescueAircraft rescueAircraft = (RescueAircraft)aircraft; FlyingState position = (FlyingState)rescueAircraft.CurrentState; double distance = Math.Sqrt((Math.Pow(destY - position.PosY, 2)) + (Math.Pow(destX - position.PosX, 2))); double tickRequired = distance / (rescueAircraft.Speed * 15); //Si le tick est plus grand que 1, deplacer l'avion if (tickRequired > 1) { double XbyTick = (destX - position.PosX) / tickRequired; double YbyTick = (destY - position.PosY) / tickRequired; position.PosX += Convert.ToInt32(XbyTick); position.PosY += Convert.ToInt32(YbyTick); }//Sinon, l'avion est arrivé else if (tickRequired < 1 && rescueAircraft.HasArrived == false) { HasArrived = true; position.PosX = destX; position.PosY = destY; aircraft.destinationX = aircraft.airport.X; aircraft.destinationY = aircraft.airport.Y; } else { if (aircraft is WaterBomber) // Si l'avion est un water bomber { if (airport.fireIsExtinct(aircraft)) // verifie su le feu est éteint { aircraft.CurrentState.ChangeState(aircraft); rescueAircraft.HasArrived = false; } else // si le feu n'est pas éteint, reduire son envergure { aircraft.airport.reduceFireSpan(aircraft); } } else { // sinon, changer son etat aircraft.CurrentState.ChangeState(aircraft); rescueAircraft.HasArrived = false; } } }
/// <summary> /// Update the GUI to show the aircraft, airplane and the positionnable client /// </summary> private void UpdateGUI() { BufferedGraphicsContext currentContext; BufferedGraphics buffer; currentContext = BufferedGraphicsManager.Current; buffer = currentContext.Allocate(picMap.CreateGraphics(), picMap.DisplayRectangle); //Afficher la map Bitmap map = new Bitmap(Properties.Resources.map); Graphics g = buffer.Graphics; g.DrawImage(map, 0, 0, 1026, 591); //Afficher les airports Bitmap airportBit = new Bitmap(Properties.Resources.airport); for (int i = 0; i < scenario.Airports.Count; i++) { g.DrawImage(airportBit, scenario.Airports[i].X, scenario.Airports[i].Y, 30, 30); map.Dispose(); } //Afficher les avions en vols for (int i = 0; i < scenario.FlyingAicrafts.Count; i++) { airportBit = new Bitmap(Properties.Resources.waterbomber); if (scenario.FlyingAicrafts[i] is ObserverPlane) { airportBit = new Bitmap(Properties.Resources.observer); } else if (scenario.FlyingAicrafts[i] is RescueHelicopter) { airportBit = new Bitmap(Properties.Resources.helicopter); } else if (scenario.FlyingAicrafts[i] is PassengerPlane) { airportBit = new Bitmap(Properties.Resources.passengerAirplane); } else if (scenario.FlyingAicrafts[i] is CargoPlane) { airportBit = new Bitmap(Properties.Resources.airplane); } FlyingState position = (FlyingState)scenario.FlyingAicrafts[i].CurrentState; g.DrawImage(airportBit, position.PosX, position.PosY, 25, 25); airportBit.Dispose(); } //Afficher les clients try { foreach (PositionableClient client in scenario.ActiveClient) { airportBit = new Bitmap(Properties.Resources.fire); if (client.GetTypeClient() == "Observer") { airportBit = new Bitmap(Properties.Resources.montain); } else if (client.GetTypeClient() == "RescueTeam") { airportBit = new Bitmap(Properties.Resources.signal); } g.DrawImage(airportBit, client.PosX, client.PosY, 30, 30); airportBit.Dispose(); } } catch (Exception) { } //Afficher les lignes entre pour les avions en mouvement Point initial = new Point(); Point destination = new Point(); for (int i = 0; i < scenario.FlyingAicrafts.Count; i++) { FlyingState position = (FlyingState)scenario.FlyingAicrafts[i].CurrentState; initial.X = scenario.FlyingAicrafts[i].airport.X + 15; initial.Y = scenario.FlyingAicrafts[i].airport.Y + 15; destination.X = scenario.FlyingAicrafts[i].destinationX + 15; destination.Y = scenario.FlyingAicrafts[i].destinationY + 15; Pen color = new Pen(Brushes.Gray); if (scenario.FlyingAicrafts[i] is WaterBomber) { color = new Pen(Brushes.Yellow); } else if (scenario.FlyingAicrafts[i] is CargoPlane) { color = new Pen(Brushes.Blue); } else if (scenario.FlyingAicrafts[i] is PassengerPlane) { color = new Pen(Brushes.Green); } else if (scenario.FlyingAicrafts[i] is RescueHelicopter) { color = new Pen(Brushes.Red); } g.DrawLine(color, initial, destination); color.Dispose(); } buffer.Render(); buffer.Dispose(); g.Dispose(); GC.Collect(); }