2015-08-01 2 views
1

Я пытаюсь создать приложение Windows Forms, где прямоугольник перемещается по часовой стрелке. Вот изображение. enter image description hereПрямоугольник по часовой стрелке

И вот мой код.

public partial class Form1 : Form 
{ 
    int x; 
    int y; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.FillRectangle(Brushes.Crimson, x, y, 20, 20); 
    } 

    private void movingTimer_Tick(object sender, EventArgs e) 
    { 
     while (true) 
     { 
      if (x < 750) 
      { 
       x += 5; 
      } 
      else if (x == 750 && y < 340) 
      { 
       y += 5; 
      } 
      break; 
     } 

     Invalidate(); 
    } 
} 

Я понимаю, почему я не могу идти дальше. Если я делаю новую инструкцию if с x - = 5, она будет активирована одновременно с циклом while. То, что я не могу понять, как отделить новые команды (х - = 5 и у - = 5), поэтому он будет активирован только после моего первого цикла, а закончена.

ответ

1

Поскольку я не знаю, куда вы хотите идти оттуда, я предоставлю вам наиболее Staight вперед решение:

if (y <= 0 && x < 750) 
{ 
    x += 5; 
} 
else if (x == 750 && y < 340) 
{ 
    y += 5; 
} 
else if (y >= 340 && x > 0) 
{ 
    x-=5; 
} 
else if (y > 0 && x <= 0) 
{ 
    y-=5; 
} 
break; 

Вы, возможно, придется настроить значения немного, но я думаю, вы можете Выясните это здесь.

1

Хорошо, я думаю, что понял. Я сделал это так.

while (true) 
     { 
      if (x < 750 && y == 0) 
      { 
       x += 5; 
      } 
      else if (x == 750 && y < 340) 
      { 
       y += 5; 
      } 
      else if (x > 0 && y >= 340) 
      { 
       x -= 5; 
      } 
      else if (x == 0 && y > 0) 
      { 
       y -= 5; 
      } 
      break; 
     } 

Но у меня есть ощущение, что существует более простой и элегантный способ сделать это. Может ли кто-нибудь предложить что-то лучше?

+0

Мех же идею, но вы набрали быстрее ;-) – h3n

+0

более элегантный способ может быть запомнить направление вы собираетесь, то в каждой итерации проверки, если вы ударить препятствие (в этом случае конец холста), а затем изменить направление, основанное на этом ... – h3n

+0

и, кстати, почему вы делаете это через некоторое время (правда), если вы в конечном итоге нарушаете этот цикл? – h3n

1

Вам не нужен цикл while, поскольку вы используете таймер, также не проверяйте постоянные значения в ваших операторах if, поскольку эти значения не будут работать, если вы измените размер формы.

Используйте следующий код:

private void movingTimer_Tick(object sender, EventArgs e) 
{ 
    if (y <= 0 && x < this.ClientSize.Width-20) 
    { 
     x += 5; 
     y = 0; 
    } 
    if (x >= this.ClientSize.Width - 20 && y< this.ClientSize.Height-20) 
    { 
     x = this.ClientSize.Width - 20; 
     y += 5; 
    } 
    if(y>= this.ClientSize.Height -20) 
    { 
     x -= 5; 
     y = this.ClientSize.Height - 20; 
    } 
    if (x <=0 && y >0) 
    { 
     x = 0; 
     y -= 5; 
    } 

    Invalidate(); 
} 
+0

Я начал изучать, как кодировать только недели, поэтому я не знал об этом «this.ClientSize.Height/Width». Я даже не знаю, как это называется. Метод, правильно? Спасибо за просвещение. – Roman