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, botów: 0