none
Collision déplacement RRS feed

  • Question

  • Bonjour, dans le cadre de mes cours de C#, je dois faire un petit programme avec un panel se déplaçant de haut en bas et de gauche a droite à l'aide de boutons (ce qui est chose faite !).

    Je dois par la suite ajouter un panel au milieu de ma Form1 (je travaille avec Visual Studio) que mon premier panel, celui qui se déplace, ne peut pas traverser.

    Je n'y arrive pas et ne trouve pas comment faire pour pouvoir déplacer mon premier panel autour du second et l'empêcher de passer au travers.

    Je suis ouvert à toutes propositions !

    Merci d'avances pour vos réponses et j'espère pouvoir trouver la solution a mon problème.

    dimanche 11 janvier 2015 17:20

Réponses

  • Le TryMove peut s'écrire aussi ainsi (mais peut-être plus compliqué à comprendre) :

            private void TryMove(Control ctrl, Size move)
            {
                var wantedRectangle = new Rectangle(ctrl.Location + move, ctrl.Size);
                if (!_panels
                    .Where(pn => !pn.Equals(ctrl))
                    .Any(control => wantedRectangle.Left <= control.Right &&
                                    wantedRectangle.Right >= control.Left &&
                                    wantedRectangle.Top <= control.Bottom &&
                                    wantedRectangle.Bottom >= control.Top))
                {
                    ctrl.Location = wantedRectangle.Location;
                }
            }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 12 janvier 2015 08:36
  • Bonjour,

    Vous pouvez faire un truc du genre :

            public Form1()
            {
                InitializeComponent();
                _panels = new Control[] {pn1, pn2, pn3};
            }
    
    
            private readonly Control[] _panels;
    
            private void btnMoveRight_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(5, 0));
            }
            private void btnMoveLeft_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(-5, 0));
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(0, -5));
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(0, 5));
            }
            private void TryMove(Control ctrl, Size move)
            {
                var wantedRectangle = new Rectangle(ctrl.Location + move, ctrl.Size);
                foreach (var control in _panels.Where(pn=>!pn.Equals(ctrl)))
                {
                    if (wantedRectangle.Left <= control.Right && 
                        wantedRectangle.Right >= control.Left &&
                        wantedRectangle.Top <= control.Bottom && 
                        wantedRectangle.Bottom >= control.Top)
                    {
                        return;
                    }
    
                }
                ctrl.Location = wantedRectangle.Location;
            }



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 12 janvier 2015 08:34

Toutes les réponses

  • Bonjour,

    Vous pouvez faire un truc du genre :

            public Form1()
            {
                InitializeComponent();
                _panels = new Control[] {pn1, pn2, pn3};
            }
    
    
            private readonly Control[] _panels;
    
            private void btnMoveRight_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(5, 0));
            }
            private void btnMoveLeft_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(-5, 0));
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(0, -5));
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                TryMove(pn1, new Size(0, 5));
            }
            private void TryMove(Control ctrl, Size move)
            {
                var wantedRectangle = new Rectangle(ctrl.Location + move, ctrl.Size);
                foreach (var control in _panels.Where(pn=>!pn.Equals(ctrl)))
                {
                    if (wantedRectangle.Left <= control.Right && 
                        wantedRectangle.Right >= control.Left &&
                        wantedRectangle.Top <= control.Bottom && 
                        wantedRectangle.Bottom >= control.Top)
                    {
                        return;
                    }
    
                }
                ctrl.Location = wantedRectangle.Location;
            }



    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 12 janvier 2015 08:34
  • Le TryMove peut s'écrire aussi ainsi (mais peut-être plus compliqué à comprendre) :

            private void TryMove(Control ctrl, Size move)
            {
                var wantedRectangle = new Rectangle(ctrl.Location + move, ctrl.Size);
                if (!_panels
                    .Where(pn => !pn.Equals(ctrl))
                    .Any(control => wantedRectangle.Left <= control.Right &&
                                    wantedRectangle.Right >= control.Left &&
                                    wantedRectangle.Top <= control.Bottom &&
                                    wantedRectangle.Bottom >= control.Top))
                {
                    ctrl.Location = wantedRectangle.Location;
                }
            }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 12 janvier 2015 08:36