Wątek przeniesiony 2016-03-09 00:24 z Kosz przez Shalom.

Zatrzymanie obiektów w równych odległościach

0

Moja formatka to tak jakby symulacja przejazdu kolejowego - mamy pociąg i autka, które zatrzymują się na sygnalizacji gdy pociąg jedzie. Do pełni szczęścia brakuje mi by autka przed przejazdem zatrzymywały się w równych odległościach - w chwili obecnej najeżdżają na siebie. Próbowałem to zrobić przez Offset punktu lokalizacyjnego itp. ale ni w ząb nic nie działa, może ktoś coś podsunie. Możliwe że coś z blokadą wątku jest nie tak.

private void wykonajWatek1(object state)
        {
            bool gotIt = false;
            WatekInfo info = state as WatekInfo;

            lock (blokada)
            {
                if (autoa[licznik] == false)
                {

                    gotIt = true;

                }
            }

            if (gotIt == true)
                {
                
                    for (int i = 0; i < 175; i++) //odleglosc na jaka samochod sie porusza
                    {
                        if (p == 0) //p reguluje semafor 0 - brak swiatel, 1 - czerwone
                        {
                            this.Invoke((MethodInvoker)delegate
                        {
                            info.Auto.Location = new Point(info.Auto.Location.X, info.Auto.Location.Y + 3); //zmiana polozenia samochodu
                            this.Refresh();
                        });

                        }
                        else if ((p == 1 && (info.Auto.Location.Y < 225 || info.Auto.Location.Y > 235))) //obszar niebezpieczny dla samochodu gdy przejezdza pociag, przed tym polem samochody zatrzymuja sie 
                        {
                            this.Invoke((MethodInvoker)delegate
                            {
                                info.Auto.Top += 3; //przyspieszenie samochodu gdy znajdzie sie w niebezpiecznym polu

                              
                                
                            });
                        }
                        else
                        {
                            do
                            {
                            } while ((p == 1));
                        }
                        Thread.Sleep(50);
                    }
                    lock (blokada)
                    {
                       // autoa[licznik - 1] = true;
                        //info.Auto.Top += 13;
                    }
            }

        } 
0

Duży plus za umieszczenie kodu od razu bez proszenia przez innych. Nie każdego autora wątku w tym dziale na to stać. Byłoby jeszcze lepiej, gdyby ten kod był czytelny dla osoby trzeciej albo chociaż jakoś skomentowany, co się w nim dzieje. Jak zobaczyłam

                    for (int i = 0; i < 175; i++)

to już mi się dalej nie chce czytać, bo nie ogarniam.

1

Musisz standardowo wykryć kolizję między obiektami. Ogólnie całość kodu do przepisania ale że próbujesz to pomogę :) Jeszcze jedna uwaga, nie pisz tak bo nabierzesz słych nawyków.


private void wykonajWatek1(object state)
{
	bool gotIt = false;
	WatekInfo info = state as WatekInfo;

	lock (lockk)
	{
		if (autoa[licznik] == false)
		{
			gotIt = true;
		}
	}

	if (gotIt)
		{
		
			for (int i = 0; i < 175; i++)
			{
				if (p == 0)
				{
					var allOthersCars = new List<PictureBox>();
					foreach (Control c in this.Controls)
					{
						if (c is PictureBox && !Object.ReferenceEquals(c, info.Auto) && !Object.ReferenceEquals(c, pictureBox1))
						{
							allOthersCars.Add(c as PictureBox);
						}
					}

					int newYPosition = info.Auto.Bottom + 3;
					bool canMoveForward = allOthersCars.Any(c => newYPosition >= c.Top && newYPosition < c.Bottom);

					if (!canMoveForward)
					{
						this.Invoke((MethodInvoker)delegate
						{
							info.Auto.Location = new Point(info.Auto.Location.X, info.Auto.Location.Y + 3);
							this.Refresh();
						});
					}
				}
				else if ((p == 1 && (info.Auto.Location.Y < 225 || info.Auto.Location.Y > 235)))
				{
					var allOthersCars = new List<PictureBox>();
					foreach (Control c in this.Controls)
					{
						if (c is PictureBox && !Object.ReferenceEquals(c, info.Auto) && !Object.ReferenceEquals(c, pictureBox1))
						{
							allOthersCars.Add(c as PictureBox);
						}
					}

					int newYPosition = info.Auto.Bottom + 3;
					bool canMoveForward = allOthersCars.Any(c => newYPosition >= c.Top && newYPosition < c.Bottom);

					if (!canMoveForward)
					{
						this.Invoke((MethodInvoker)delegate
						{
							info.Auto.Location = new Point(info.Auto.Location.X, info.Auto.Location.Y + 3);
							this.Refresh();
						});
					}
				}
				else
				{
					do
					{
					} while ((p == 1));
				}
				Thread.Sleep(50);
			}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1