Exemple #1
0
        /// <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();
        }