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;

        }
    }
4

1 回答 1

1

代码有几个问题。

首先,您可能只想在 On_Paint 事件上进行绘画。当那个事件被触发时,你可以简单地把你的车涂在它应该在的地方。有一个PaintEventArgs被传递给 On_Paint 事件,并且包含一个 Graphics 对象。

在您的移动函数中,创建一个用于移动汽车的线程是一件好事,但您不想在每次按下键时都重新创建线程。相反,您可以在表单上保持方向状态,例如bool IsMovingLeftint Velocity。然后您创建一个线程,该线程根据该变量的状态更新位置。

一旦您对汽车的位置进行了更新,强制 Form/Control 重新绘制自身也是很好的。你可以用它this.Refresh()来实现。

于 2012-06-20T14:01:35.430 回答