我是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();
}
这是我尝试过的。我仍然试图在不使用计时器的情况下做同样的事情。
答案 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()
。