С# нарисовать движущуюся частицу

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

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 для очистки графики, но это тоже не сработало, поэтому я нарисовал черный прямоугольник в старом положении, прежде чем переместить его в новое положение.

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


person CSawy    schedule 10.05.2013    source источник
comment
Пробовали установить для свойства DoubleBuffered вашей формы значение true?   -  person Blorgbeard    schedule 10.05.2013
comment
В представлении дизайна вашей формы перейдите в окно свойств (Вид -> Окно свойств) и найдите строку с надписью DoubleBuffered, измените значение на True   -  person Blorgbeard    schedule 10.05.2013
comment
Спасибо. Я попробовал это, но я не работал .. все еще слишком мигает!   -  person CSawy    schedule 10.05.2013


Ответы (1)


Попробуйте это... добавьте панель (panel1) в форму:

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);
    }

}
person Idle_Mind    schedule 10.05.2013
comment
Лучше хуже? Насколько велика панель? У вас есть еще какой-нибудь рисунок? Можете ли вы показать нам полный код, который вы используете? - person Idle_Mind; 13.05.2013
comment
то же самое, не лучше и не хуже нет, другого рисунка нет. мой код точно такой же, как ваш. я просто скопировал/вставил! - person CSawy; 14.05.2013
comment
У меня Win8 и мерцания нет. В чем ты это запускаешь? - person Idle_Mind; 14.05.2013
comment
Windows 7. Я проверю это на другой машине и вернусь к вам. Большое спасибо - person CSawy; 14.05.2013