C#GDI将椭圆从一个点移动到另一个点并返回

时间:2012-06-20 12:11:38

标签: c# gdi

我正在创建一个模拟汽车游戏的应用程序,它使用两个键,左右键。我正在使用椭圆并在两个方向上移动它。当我启动应用程序并将椭圆移动到右键时,当我按下左键时它会冻结,我正在使用另一个必须不断向下移动的椭圆。 下面是我用来移动椭圆的两个函数。以及表单的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;

        }
    }

1 个答案:

答案 0 :(得分:0)

代码有几个问题。

首先,您可能只想在On_Paint事件上绘画。当该事件被触发时,您可以简单地将您的汽车描绘到应该的位置。有一个PaintEventArgs被传递给On_Paint事件,并且包含一个Graphics对象。

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

一旦你更新了汽车的位置,强制表格/控制重绘自己也是一件好事。您可以使用this.Refresh()来完成此任务。