2014-12-16 3 views
0

Я хочу реализовать код, который изображение течет в бесконечном цикле в качестве фона. Сделать это. Я подготовил 2 объекта изображения (коробка с картинками). затемКак плавно перемещать изображение автоматически? в C#

Я реализую код движущегося изображения, как показано ниже. (Я очистил какой-то несущественный код в этом разделе)

private void InitializeComponent() 
{ 
    this.p1.Image = ((System.Drawing.Image)(resources.GetObject("picture"))); 
    this.p1.Location = new System.Drawing.Point(0, -1000); // 0,0 // 0, -1000 
    this.p1.Size = new System.Drawing.Size(1000, 1000); 

    this.p2.Image = ((System.Drawing.Image)(resources.GetObject("picture"))); 
    this.p2.Location = new System.Drawing.Point(0, 1000); // 0,0 // 0, -1000 
    this.p2.Size = new System.Drawing.Size(1000, 1000); 

    t1 = new Thread(new ParameterizedThreadStart(loop)); 
    t1.Start(); 
} 

private void loop(Object o) 
{ 
    CTMethod cttest = new CTMethod(movePictureBox); 
    while (true) 
    { 
     try 
     { 
      this.Invoke(cttest); 
      Thread.Sleep(10); // I updated.. 
     } catch(Exception e) { 
      break; 
     } 
    } 
} 

private void movePictureBox() 
{ 

    if (p1.Top == 0) 
    { 
     p2.Top = p1.Top-p2.Height; 
    } 

    if (p2.Top == 0) 
    { 
     p1.Top = p2.Top-p1.Height; 
    } 

    p1.Top++; 
} 

этот код работает хорошо. Но я столкнулся с некоторыми проблемами. Линия связи (подключенная линия) из 2 изображений выглядит заикающейся или время от времени тряски. Я не знаю, почему изображения движутся так. Имеет ли это отношения с lerp (интерполяция)? Если кто-то знает причину, не могли бы вы мне помочь?

+1

перемещение означает анимацию. Для этого есть [API] (http://msdn.microsoft.com/en-us/library/ms752312%28v=vs.110%29.aspx), потому что это не так просто, как установка координат и сон. –

+3

@DmitryLedentsov Этот API для WPF, вопрос, похоже, касается Winforms (а не того, что метод OP - это то, как это должно быть сделано). – Rotem

+0

@DmitryLedentsov Это зависит от того, чего вы пытаетесь достичь. некоторые виды движения могут хорошо подходить для анимации с API, некоторые из них не так много. –

ответ

0

Это может быть потому, что вы используете System.Drawing.Point

http://msdn.microsoft.com/en-us/library/system.drawing.point%28v=vs.110%29.aspx

Это означает, что положение определяется System.Drawing.Point захватят целые числа, в результате чего один пиксель прыгает во время анимации.

Вы можете использовать System.Drawing.Pointf (так как это использует числа с плавающей точкой, а не целые числа)

То же самое касается System.drawing.size, который описывает ширину и высоту в целых числах

MSDN on system.drawing.size

К сожалению, все Элементы управления Winforms (как указал Ротем) используют System.Drawing.Point, что делает их по своей сути непригодными для гладкой анимации.

Возможно, вам лучше рисовать изображения прямо на объекте Graphics.

+0

Как использовать «PointF» в качестве местоположения «Control», который является «Point», а не «PointF»? – Rotem

+0

Err, я думаю, что расположение элемента управления «Point» ... Размер «размер» –

+1

Извините, исправлено мое замечание. Тем не менее точка остается. Проблема заключается в том, что для присвоения значения он должен быть усечен до интегральной «Точки». – Rotem

0

Вы можете попробовать добавить этот код в конструкторе формы,

SetStyle(ControlStyles.ResizeRedraw, true); 
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

Это не хороший выбор для пользовательского рисования в WinForms, XNA является хорошим выбором, это краска с двойным буфером.

+2

Winforms могут рисовать с помощью двойного буфера и умело обрабатывать простой рисунок. – Rotem

Смежные вопросы