車のゲームをシミュレートするアプリケーションを作成しています。左右のキーの 2 つのキーを使用します。私は楕円を使用しており、それを両方向に動かしています。アプリケーションを起動して楕円を右のキーに移動すると、左のキーを押すと正常に動作し、フリーズし、常に下に移動する必要がある別の楕円を使用しています。以下は、楕円を移動するために使用する 2 つの関数です。およびフォームの 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;
}
}