C# - 不使用计时器将图像(汽车)从a点移动到b

时间:2017-05-17 13:21:38

标签: c# winforms visual-studio-2015

我是c#的新手。我必须尝试使用​​带有计时器的线性插值公式将图像从a点移动到b,并且它可以进行更新。

但是我想,无论如何都可以在没有计时器的情况下做同样的事情。有可能吗?

这是我的示例代码。

if (Car_move == true)
{
 x = Convert.ToInt32(Source.X + time * (Dest.X - Source.X));
 y = Convert.ToInt32(Source.Y + time * (Dest.Y - Source.Y));
 G.DrawImage(Car, x - 10, y - 10, 20, 20);
 if ((Math.Sqrt((Math.Pow(Math.Abs(x - Source.X), 2) + Math.Pow(Math.Abs(y - 
   Source.Y), 2)))) >= Distance)
 {
  x = Dest.X;
  y = Dest.Y;
  Car_move = false;           
  }
} 


private void timer1_Tick(object sender, EventArgs e)
{
  if (time >= 1)
 {
   time -= 1;
 }
   time +=0.02f;
   panel1.Refresh();
   Invalidate();
}

这是我尝试过的。我仍然试图在不使用计时器的情况下做同样的事情。

3 个答案:

答案 0 :(得分:2)

尝试异步。

创建新的Windows窗体项目,将此代码放在窗体构造函数中。运行应用程序,单击表单。车在动!呀!

public Form1()
{
    //InitializeComponent();

    var Car = new PictureBox { Parent = this, BackColor = Color.Green };

    this.Click += async (s, e) =>
    {
        for (int i = 0; i < 100; i++)
        {
            Car.Top++;
            await Task.Delay(50);
        }
    };
}

答案 1 :(得分:0)

是的,有很多选择,一个是带有等待/睡眠的简单循环。另一个是做事件驱动,比如你的car.move属性,每次更改,你都可以开始你的油漆。或者task.continuewith(不是我的第一选择...... 循环:

 bool StopRunning = false;
            while (!StopRunning)
            {
                panel.Invalidate();
                Thread.Sleep(1000);
            }

答案 2 :(得分:0)

动画开始时,您可以存储时间:

private DateTime animationStarted;

public void StartAnimation()
{
    animationStarted = DateTime.Now;
    Car_move = true;
    Invalidate();
}  

这样您就不必依赖计时器来更新已用时间。您只需在Invalidate()处理程序中调用Paint即可在保持响应窗口的同时进行绘制:

public void My_Paint(object sender, PaintEventArgs e)
{
    double elapsed = DateTime.Now.Subtract(animationStarted).TotalMilliseconds;

    // ... current paint code

    if (Car_move)
    {
        Invalidate();
    }
}

请注意TaW的评论,您需要Invalidate()绘画发生的控件,如果这是panel1您需要panel1.Invalidate()