Member 12783949 Ответов: 1

Как остановить объект и изменить направление


- Привет!
Я пытаюсь сделать программу: объект движется вперед при нажатии кнопки, а когда вы отпускаете ее, он останавливается.Я не могу понять, как это сделать. Кто-нибудь может мне помочь?

Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
       {
           for (int i = 1; i < 300; i++)
           {
               int x2 = i + 1;
               int y2 = 100;
               Graphics g2 = this.CreateGraphics();
               g2.FillRectangle(new SolidBrush(Color.Black), x2, y2, 6, 6);
               Invalidate();

               int x1 = i-1;
               int y1 = 100;
               Color c = this.BackColor;
               Graphics g1 = this.CreateGraphics();
               g1.FillRectangle(new SolidBrush(c), x1, y1, 6, 6);


               System.Threading.Thread.Sleep(50);


           }
       }

1 Ответов

Рейтинг:
8

OriginalGriff

Прекратите использовать нить.Сон: это приводит к тому, что весь ваш поток - в данном случае поток пользовательского интерфейса, который выполняет всю работу по обработке дисплея и всего пользовательского ввода - приостанавливается.
И даже если бы это было не так, этот код представляет собой цикл внутри обработчика событий Click.
Это означает, что экран не обновляется, а щелчки мыши не работают, пока вы не покинете метод!

Выбросьте цикл-окна вообще и C# в частности не работают так за пределами консольных приложений.
Добавьте таймер в свою форму. Установите свойство Interval равным 100 и запустите его.
Добавить уровень класса типа bool называется "перемещение" и запустить если как ложные.
В вашем событии нажатия кнопки инвертируйте начало вашей" движущейся " переменной.
Обработки события Tick таймера.
В обработчике установите флажок "перемещение". Если это правда, сделайте свой код внутри цикла один раз, и только один раз. )Это будет означать переезд i и до уровня класса тоже. Если это ложь, ничего не делайте.

Кстати: это не лучший способ сделать работу, и это действительно опасно. На данный момент в конце любого метода вызовите Dispose для всех созданных Вами графических элементов:

g1.Dispose();
g2.Dispose();
Если вы этого не сделаете, ваше приложение рухнет раньше, чем вы думаете...
Есть более эффективные способы, такие как выполнение кода рисования в событии Form Paint, но это, как я подозреваю, на потом.