Beispiel #1
0
 /// <summary>
 /// metoda wywolywana gdy stan kolekcji obiektow klasy Train ulega zmianie, tworzy pociag
 /// i otwiera rogatki po przejezdzie poprzedniego pocaigu
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void TrainCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
 {
     //jezeli kolekcja jest pusta rogatki sie otwieraja,
     //i tworzony jest nowy watek z pociagiem.
     if (TrainCollection.Count == 0)
     {
         RailwayGates.OpenGates();
         new Thread(DisplayTrain).Start();
     }
 }
Beispiel #2
0
        /// <summary>
        /// metoda wywolywana przy kazdym ticku timera
        /// odpowiadajaca za akcje podjemowane dla obiektow w zaleznosci od ich aktualnego polozenia na Canvasie
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CarTimer_Tick(object sender, EventArgs e)
        {
            for (int i = 0; i < CarCollection.Count; i++)
            {
                //wspolrzedne samochodziku na Canvasie
                var x = Math.Round(CarCollection[i].CarImage.RenderTransform.Value.OffsetX);
                var y = Math.Round(CarCollection[i].CarImage.RenderTransform.Value.OffsetY);

                //poloznie obiektow na Canvasie w danej chwili
                //czylito ich progres w pokonywaniu przez nie trasy, wartosc miedzy 0 a 1
                state[i] = (double)CarCollection[i].Animator.GetCurrentProgress(mainWindow);

                //obiekt klasy Car zatrzymuje sie, gdy jest wystarczajaco blisko przejazdu i rogatki sa opuszczone
                if (RailwayGates.IsClosed && state[i] < 0.28 && state[i] > 0.26)
                {
                    CarCollection[i].Animator.SetSpeedRatio(mainWindow, 0);
                    CarCollection[i].Stopped = true;
                }
                else
                {
                    //gdy w danym ticku timera rogatki sa podniesione, a pojazd zatrzymany,
                    //rusza on ze swoja predkoscia poprzednia predkoscia
                    if (CarCollection[i].Stopped == true)
                    {
                        CarCollection[i].Stopped = false;
                        CarCollection[i].Animator.SetSpeedRatio(mainWindow, CarCollection[i].CarSpeed);
                    }

                    //jezeli samochodzik pokonuje zakret jego aktualna grafika zostaje zmieniona
                    //na obrazek bedacy jej lustrzanym odbiciem
                    if (state[i] > 0.27 && state[i] < 0.31 && CarCollection[i].IsRight)
                    {
                        CarCollection[i].FlipCar();
                    }
                    else if (state[i] > 0.57 && !CarCollection[i].IsRight)
                    {
                        CarCollection[i].FlipCar();
                    }

                    for (int j = 0; j < CarCollection.Count; j++)
                    {
                        //wyrazenie warunkowe uniemozliwiajace programowi podjecie proby pobrania wspolrzednych
                        //drugiego samochodziku w momencie gdy na Canvasie istnieje tylko pierwszy samochodzik
                        if (j == i)
                        {
                            continue;
                        }

                        //wspolrzedne obiektu z kolekcji
                        var x1 = Math.Round(CarCollection[j].CarImage.RenderTransform.Value.OffsetX);
                        var y1 = Math.Round(CarCollection[j].CarImage.RenderTransform.Value.OffsetY);

                        //jezeli wspolrzedne mlodszego obiektu w kolekcji (o indeksie i) beda na tyle zblizone do obiektu bezposrednio go poprzedzajcego(indeks j),
                        //ze powodowalyby nakladanie sie na siebie obrazkow dwoch samochodzikow
                        if (((x1 - x) <= 50 && (x1 - x) >= 0) && (((y1 - y) <= 110 || (y - y1) <= 110) && (y1 - y) >= 0))
                        {
                            // predkosc obiektu o indeksie i jest wieksza od predkosci obiektu go poprzedzajacego(indeks j)
                            if (CarCollection[j].CarSpeed < CarCollection[i].CarSpeed || CarCollection[j].Stopped)
                            {
                                //predkosc obiektu o indeksie i przyjmuje jako swoja predkosci odrobine pomniejszona wartosc predkosci obiektu go poprzedzajacego
                                CarCollection[i].CarSpeed = CarCollection[j].CarSpeed - CarCollection[j].CarSpeed / 20;
                                //jezeli obiekt poprzedzajacy obiekt o indeksie i zatrzymal sie przed rogatkami to ten rowniez sie zatrzymuje,
                                //w przeciwnym razie przyjmuje nowa predkosc
                                CarCollection[i].Animator.SetSpeedRatio(mainWindow, CarCollection[j].Stopped ? 0 : CarCollection[i].CarSpeed);

                                //samochodzikowi po zmianie predkosci ustawia sie wlasciowsc Stopped na true, by w przypadku przyjecia jako nowa predkosc
                                //wartosci 0, samochodzik zanim, ktory porusza sie szybciej przyjal jako swoja nowa predkosc 0, a nie wynik dzialania 0 - 0/20
                                CarCollection[i].Stopped = true;
                            }
                        }
                    }
                }

                //jezeli zaden samochodzik nie znajduje sie na przejezdzie kolejowym, a pociag jest gotowy do drogi, rogatki zostaja zamkniete
                foreach (double element in state)
                {
                    if (element > 0.28 && element < 0.31)
                    {
                        onThePass = true;
                        break;
                    }
                }
                if (RailwayGates.IsClosed && !onThePass)
                {
                    RailwayGates.CloseGates();
                }
                onThePass = false;
            }
        }