2013-05-10 4 views
0

Я чрезвычайно новичок в C#, и у меня есть простой вопрос: Я должен нарисовать белую частицу (прямоугольник) на черном фоне и переместить ее горизонтально с одного из экрана на другой. я это сделал, но проблема в том, что мигает слишком много (т.е. не является гладким, даже когда скорость высока, я могу легко увидеть черный фон между каждым движением и другим)C# нарисовать движущуюся частицу

t.Interval = 1000/speed; 
t.Tick += new EventHandler(t_Tick); 
t.Start(); 

....

void t_Tick(object sender, EventArgs e) 
     { 
      //g.Clear(Color.Black); 
      g.DrawRectangle(new Pen(Brushes.Black, 20), r);  //draw a black rectangle in the old position...20 is the thickness of the pen 
      r.X += move_x; 
      g.DrawRectangle(new Pen(Brushes.White, 20), r);  //draw a white rectangle in the new position...20 is the thickness of the pen 
      if (r.X >= 1700)  ///this means it reached the end of the screen 
       t.Stop(); 
     } 

Я использовал g.Clear, чтобы очистить графику, но это также не сработало, поэтому я поместил черный прямоугольник в прежнее положение, прежде чем переместить его в новое положение.

Любая идея, как удалить это мигание или даже сделать это по-другому?

+0

Пробовал установка 'свойство DoubleBuffered' вашей формы в' true'? – Blorgbeard

+0

нет, как это сделать? – CSawy

+0

В окне дизайна вашей формы перейдите в окно свойств (Вид -> Окно свойств) и найдите строку с надписью «DoubleBuffered», измените значение на «True» – Blorgbeard

ответ

0

Попробуйте это ... добавить панель (ПАНЕЛЬ1) в форме:

public partial class Form1 : Form 
{ 

    private Rectangle r; 
    private const int rSize = 50; 
    private const int move_x = 10; 
    private System.Windows.Forms.Timer tmr; 

    public Form1() 
    { 
     InitializeComponent(); 

     panel1.BackColor = Color.Black; 
     r = new Rectangle(0, panel1.Height/2 - rSize/2, rSize, rSize); 

     tmr = new System.Windows.Forms.Timer(); 
     tmr.Interval = 50; 
     tmr.Tick += new EventHandler(tmr_Tick); 
     tmr.Start(); 

     panel1.Paint += new PaintEventHandler(panel1_Paint); 
    } 

    void tmr_Tick(object sender, EventArgs e) 
    { 
     r.X += move_x; 
     panel1.Refresh(); 
     if (r.X > panel1.Width) 
     { 
      tmr.Stop(); 
      MessageBox.Show("Done"); 
     } 
    } 

    void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawRectangle(Pens.White, r); 
    } 

} 
+0

Большое спасибо, но все та же проблема :( – CSawy

+0

Лучше? ... хуже? Насколько велика панель? У вас есть какой-либо другой рисунок? Можете ли вы показать нам полный код, который вы используете? –

+0

то же самое, не лучше или хуже нет, другого рисунка нет мой код точно так же, как и ваш, я просто скопировал/вставлял его! – CSawy