/// <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(); } }
/// <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; } }