Stykanie się objektów c#

0

Witam. Mam pewien problem z wykonaniem funkcji dla kontroli panel1 która będzie odpowiadała za blokowanie poruszania gdy panel1 dotknie panelu2 obojętnie jakim bokiem. Proszę o pomoc.

user image

Obecnie mam takiego malutkiego if'a, który porównuje boki (oś X) niestety nie działa tak jakbym chciał.

         if (panel1.Top== panel2.Bottom)
            {
                label1.Text = "nie mozesz przejsc";

            }
0

Jak chcesz ładnie i estetycznie zrób sobie klasę Rectangle (prostokąt) i tam trzymaj jego rozmiar i współrzędne boków. Każdemu panelowi przypisujesz własny Rectangle i napisz sobie jeszcze metodę do sprawdzania czy się styka jeden z drugim. Coś takiego:

class Rectangle
	{
		private int width, height;
		private int x, y;

		public int X
		{
			get { return x; }
		} // odpowiada również lewej krawędzi (left)
		public int Y
		{
			get { return y; }
		} // odpowiada również górnej krawędzi (top)
		public int Width
		{
			get { return width; }
		}
		public int Height
		{
			get { return height; }
		}
		public int Right
		{
			get { return x + width; }
		}
		public int Bottom
		{
			get { return y + height; }
		}

		public Rectangle(int x, int y, int width, int height)
		{
			this.x = x;
			this.y = y;
			this.width = width;
			this.height = height;
		}
		public bool Intersects(Rectangle rectangle)
		{
			if ((rectangle.X >= this.X && rectangle.X <= this.Right) && (rectangle.Y >= this.Y && rectangle.Y <= this.Bottom))
				return true;
			else
				return false;
		}
	}

Jeżeli nie potrzebne ci są właściwości tego prostokąta na zew., a tylko metoda Intersects to wywal wszystkie prócz Right i Bottom, które zmień na prywatne.

0

Na priv poszła wiadomość. Chciałbym abyś nieco wytłumaczył mi co do czego.

0

Rev, dzięki za link. Problem rozwiązałem:

rectangle1 to czerwony kwadrat a rectangle2 to zielony:

             Rectangle rectangle1 = new Rectangle(x, y, 30, 30);
            Rectangle rectangle2 = new Rectangle(161,154,30,60);

            if (rectangle1.IntersectsWith(rectangle2))
            {
                rectangle1.Intersect(rectangle2);
                if (!rectangle1.IsEmpty)
                {
                    label1.Text = "dotyk";
                }
            }
            else label1.Text = "nic";
        }
0

A po co to dodatkowe przecięcie i ten wewnętrzny warunek?

0

W sumie masz racje, wywaliłem to i też działa.

if (koles.IntersectsWith(prawo)) panel1.Location = new Point(x = x - 1, y); 

Dzięki jeszcze raz :D

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