我正在创建一个模拟汽车游戏的应用程序,它使用两个键,左右键。我正在使用椭圆并在两个方向上移动它。当我启动应用程序并将椭圆移动到右键时,当我按下左键时它会冻结,我正在使用另一个必须不断向下移动的椭圆。 下面是我用来移动椭圆的两个函数。以及表单的key_down事件:
public void MoveLeft()
{
if (startPoint.Y > 100)
{
startPoint.Y = 1;
}
while (startPoint.Y > 1)
{
graphics.Clear(BackColor);
if (startPoint.Y > this.ClientSize.Height)
startPoint.Y = 0;
startPoint.Y += 5;
graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100)));
graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100)));
Move();
System.Threading.Thread.Sleep(50);
}
}
public void MoveRight()
{
while (startPoint.Y > 1)
{
if (startPoint.Y > this.ClientSize.Height)
startPoint.Y = 0;
startPoint.Y += 5;
carPoint = new Point(100, 250);
graphics.DrawEllipse(Pens.Black, new Rectangle(carPoint, new Size(100, 100)));
graphics.FillEllipse(new SolidBrush(Color.Green), new Rectangle(carPoint, new Size(100, 100)));
Move();
System.Threading.Thread.Sleep(50);
graphics.Clear(BackColor);
}
}
public void Move()
{
graphics.DrawEllipse(Pens.Black, new Rectangle(startPoint, new Size(100, 100)));
graphics.FillEllipse(new TextureBrush(image), new Rectangle(startPoint, new Size(100, 100)));
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.Right:
{
moveCar = new Thread(new ThreadStart(MoveRight));
moveCar.Start();
}
break;
case Keys.Left:
{
if (moveCar != null)
{
moveCar.Abort();
moveCar = null;
}
moveCar = new Thread(new ThreadStart(MoveLeft));
moveCar.Start();
}
break;
}
}
答案 0 :(得分:0)
代码有几个问题。
首先,您可能只想在On_Paint事件上绘画。当该事件被触发时,您可以简单地将您的汽车描绘到应该的位置。有一个PaintEventArgs
被传递给On_Paint事件,并且包含一个Graphics对象。
在你的移动功能中,创建一个用于移动汽车的线程是一件好事,但是每次按下一个键时你都不想重新创建线程。相反,您可以在表单上保留方向状态,例如bool IsMovingLeft
或int Velocity
。然后创建一个线程,根据该变量的状态更新位置。
一旦你更新了汽车的位置,强制表格/控制重绘自己也是一件好事。您可以使用this.Refresh()
来完成此任务。