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



我是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();
}

这就是我尝试过的。我仍在尝试弄清楚在不使用计时器的情况下做同样的事情。

尝试异步。

创建新的 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);
        }
    };
}

是的,有很多选择,一个是一个简单的循环,里面有一个等待/睡眠。 另一种方法是做事件驱动,比如你的car.move属性,每次改变时,你都可以烧掉你的油漆。或者任务继续(不会是我的首选...
圈:

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

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

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

这样,您就不必依赖计时器来更新经过的时间。只需从Paint处理程序调用Invalidate()即可频繁绘制,同时保持响应窗口:

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()

最新更新